diff --git a/src/core/packages/saved-objects/migration-server-internal/src/core/unused_types.ts b/src/core/packages/saved-objects/migration-server-internal/src/core/unused_types.ts
index 48594416cbece..2d234c6f4d3d3 100644
--- a/src/core/packages/saved-objects/migration-server-internal/src/core/unused_types.ts
+++ b/src/core/packages/saved-objects/migration-server-internal/src/core/unused_types.ts
@@ -11,6 +11,8 @@ import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/type
 
 /**
  * Types that are no longer registered and need to be removed
+ * As of 8.8, no new types are allowed to be removed.
+ * Removing saved object types is not backward compatible
  */
 export const REMOVED_TYPES: string[] = [
   'apm-services-telemetry',
diff --git a/src/core/packages/saved-objects/server-internal/index.ts b/src/core/packages/saved-objects/server-internal/index.ts
index 7b67bfa6861b4..3a9c80749c72e 100644
--- a/src/core/packages/saved-objects/server-internal/index.ts
+++ b/src/core/packages/saved-objects/server-internal/index.ts
@@ -11,6 +11,7 @@ export {
   MIGRATION_CLIENT_OPTIONS,
   SavedObjectsService,
   CoreSavedObjectsRouteHandlerContext,
+  SAVED_OBJECT_TYPES_COUNT,
 } from './src';
 export type {
   InternalSavedObjectsServiceStart,
diff --git a/src/core/packages/saved-objects/server-internal/src/index.ts b/src/core/packages/saved-objects/server-internal/src/index.ts
index a964d30a0e66a..ae34f8f945462 100644
--- a/src/core/packages/saved-objects/server-internal/src/index.ts
+++ b/src/core/packages/saved-objects/server-internal/src/index.ts
@@ -18,3 +18,4 @@ export type {
   InternalSavedObjectsRequestHandlerContext,
   InternalSavedObjectRouter,
 } from './internal_types';
+export { SAVED_OBJECT_TYPES_COUNT } from './object_types';
diff --git a/src/core/packages/saved-objects/server-internal/src/object_types/index.ts b/src/core/packages/saved-objects/server-internal/src/object_types/index.ts
index 74ba99cf95498..6246c59b8e943 100644
--- a/src/core/packages/saved-objects/server-internal/src/object_types/index.ts
+++ b/src/core/packages/saved-objects/server-internal/src/object_types/index.ts
@@ -8,3 +8,7 @@
  */
 
 export { registerCoreObjectTypes } from './registration';
+
+// set minimum number of registered saved objects to ensure no object types are removed after 8.8
+// declared in internal implementation exclicilty to prevent unintended changes.
+export const SAVED_OBJECT_TYPES_COUNT = 127 as const;
diff --git a/src/core/packages/saved-objects/server/src/type_registry.ts b/src/core/packages/saved-objects/server/src/type_registry.ts
index a1128b683166b..d64ca1917be0d 100644
--- a/src/core/packages/saved-objects/server/src/type_registry.ts
+++ b/src/core/packages/saved-objects/server/src/type_registry.ts
@@ -8,7 +8,6 @@
  */
 
 import type { SavedObjectsType } from './saved_objects_type';
-
 /**
  * Registry holding information about all the registered {@link SavedObjectsType | saved object types}.
  */
diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts
index 43d5403245e64..427fcc06c3c30 100644
--- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts
+++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts
@@ -15,6 +15,7 @@ import {
   createRootWithCorePlugins,
   type TestElasticsearchUtils,
 } from '@kbn/core-test-helpers-kbn-server';
+import { SAVED_OBJECT_TYPES_COUNT } from '@kbn/core-saved-objects-server-internal';
 
 describe('checking migration metadata changes on all registered SO types', () => {
   let esServer: TestElasticsearchUtils;
@@ -46,6 +47,8 @@ describe('checking migration metadata changes on all registered SO types', () =>
   // This test is meant to fail when any change is made in registered types that could potentially impact the SO migration.
   // Just update the snapshot by running this test file via jest_integration with `-u` and push the update.
   // The intent is to trigger a code review from the Core team to review the SO type changes.
+  // The number of types in the hashMap should never be reduced, it can only increase.
+  // Removing saved object types is forbidden after 8.8.
   it('detecting migration related changes in registered types', () => {
     const allTypes = typeRegistry.getAllTypes();
 
@@ -185,5 +188,6 @@ describe('checking migration metadata changes on all registered SO types', () =>
         "workplace_search_telemetry": "52b32b47ee576f554ac77cb1d5896dfbcfe9a1fb",
       }
     `);
+    expect(Object.keys(hashMap).length).toEqual(SAVED_OBJECT_TYPES_COUNT);
   });
 });
diff --git a/src/core/server/integration_tests/saved_objects/jest.integration.config.js b/src/core/server/integration_tests/saved_objects/jest.integration.config.js
index 842eeb6e9d19d..6f1903f5cf689 100644
--- a/src/core/server/integration_tests/saved_objects/jest.integration.config.js
+++ b/src/core/server/integration_tests/saved_objects/jest.integration.config.js
@@ -16,6 +16,7 @@ module.exports = {
   preset: '@kbn/test/jest_integration',
   rootDir: '../../../../..',
   roots: [
+    '<rootDir>/src/core/server/integration_tests/saved_objects/registration',
     '<rootDir>/src/core/server/integration_tests/saved_objects/routes',
     '<rootDir>/src/core/server/integration_tests/saved_objects/service',
     '<rootDir>/src/core/server/integration_tests/saved_objects/validation',
diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts b/src/core/server/integration_tests/saved_objects/registration/type_registrations.test.ts
similarity index 100%
rename from src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts
rename to src/core/server/integration_tests/saved_objects/registration/type_registrations.test.ts