diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index 27154e54c2a543da44381f33a507d4200acbfabf..59dd5a52d2fa3d3a352368b6752c4b331331a153 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -412,9 +412,6 @@ export function migrateConfig(
           }
           migratedConfig[key] = newArray;
         }
-      } else if (key === 'compatibility' && is.object(val)) {
-        migratedConfig.constraints = migratedConfig.compatibility;
-        delete migratedConfig.compatibility;
       } else if (is.object(val)) {
         const subMigrate = migrateConfig(
           migratedConfig[key] as RenovateConfig,
diff --git a/lib/config/migrations/custom/compatibility-migration.spec.ts b/lib/config/migrations/custom/compatibility-migration.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8e44860120a0fdfb8c517ede4a846031b18c2233
--- /dev/null
+++ b/lib/config/migrations/custom/compatibility-migration.spec.ts
@@ -0,0 +1,27 @@
+import { CompatibilityMigration } from './compatibility-migration';
+
+describe('config/migrations/custom/compatibility-migration', () => {
+  it('should migrate object', () => {
+    expect(CompatibilityMigration).toMigrate(
+      {
+        compatibility: {
+          test: 'test',
+        },
+      },
+      {
+        constraints: {
+          test: 'test',
+        },
+      }
+    );
+  });
+
+  it('should just remove property when compatibility is not an object', () => {
+    expect(CompatibilityMigration).toMigrate(
+      {
+        compatibility: 'test',
+      },
+      {}
+    );
+  });
+});
diff --git a/lib/config/migrations/custom/compatibility-migration.ts b/lib/config/migrations/custom/compatibility-migration.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a22ddb1485a81dd0f871f1afd7e4acb7b7bd3bf1
--- /dev/null
+++ b/lib/config/migrations/custom/compatibility-migration.ts
@@ -0,0 +1,13 @@
+import is from '@sindresorhus/is';
+import { AbstractMigration } from '../base/abstract-migration';
+
+export class CompatibilityMigration extends AbstractMigration {
+  override readonly deprecated = true;
+  override readonly propertyName = 'compatibility';
+
+  override run(value: unknown): void {
+    if (is.object(value)) {
+      this.setSafely('constraints', value);
+    }
+  }
+}
diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts
index 447d57c645e78f472d47b539e30a03d068fc279c..60caacfd7a8cef7b73513e4334927b7d12195012 100644
--- a/lib/config/migrations/migrations-service.ts
+++ b/lib/config/migrations/migrations-service.ts
@@ -3,6 +3,7 @@ import type { RenovateConfig } from '../types';
 import { RemovePropertyMigration } from './base/remove-property-migration';
 import { RenamePropertyMigration } from './base/rename-property-migration';
 import { BinarySourceMigration } from './custom/binary-source-migration';
+import { CompatibilityMigration } from './custom/compatibility-migration';
 import { ComposerIgnorePlatformReqsMigration } from './custom/composer-ignore-platform-reqs-migration';
 import { EnabledManagersMigration } from './custom/enabled-managers-migration';
 import { GoModTidyMigration } from './custom/go-mod-tidy-migration';
@@ -48,6 +49,7 @@ export class MigrationsService {
 
   static readonly customMigrations: ReadonlyArray<MigrationConstructor> = [
     BinarySourceMigration,
+    CompatibilityMigration,
     ComposerIgnorePlatformReqsMigration,
     EnabledManagersMigration,
     GoModTidyMigration,