diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap
index 5da56cd9767a737826ef1a0bfc112152fd661bb9..909c56ff3485747f65f9c75d5e3e39b2d0ec77c6 100644
--- a/lib/config/__snapshots__/migration.spec.ts.snap
+++ b/lib/config/__snapshots__/migration.spec.ts.snap
@@ -191,6 +191,7 @@ exports[`config/migration migrateConfig(config, parentConfig) migrates config 1`
       "groupName": "angular packages",
       "matchPackageNames": [
         "/^(@angular|typescript)/",
+        "!foo",
       ],
     },
     {
diff --git a/lib/config/migrations/custom/package-rules-migration.spec.ts b/lib/config/migrations/custom/package-rules-migration.spec.ts
index 709991cfd9fcd62538d7f29c05ed33a7c76b859c..24b4ae417734147d2331dc41726bfc337e19fdaf 100644
--- a/lib/config/migrations/custom/package-rules-migration.spec.ts
+++ b/lib/config/migrations/custom/package-rules-migration.spec.ts
@@ -174,6 +174,51 @@ describe('config/migrations/custom/package-rules-migration', () => {
     );
   });
 
+  it('should migrate all match/exclude when value is of type string', () => {
+    expect(PackageRulesMigration).toMigrate(
+      {
+        packageRules: [
+          {
+            matchPackagePatterns: 'pattern',
+            matchPackagePrefixes: 'prefix1',
+            matchSourceUrlPrefixes: 'prefix1',
+            excludePackageNames: 'excluded',
+            excludePackagePatterns: 'excludepattern',
+            excludePackagePrefixes: 'prefix1b',
+            matchDepPatterns: 'pattern',
+            matchDepPrefixes: 'prefix1',
+            excludeDepNames: 'excluded',
+            excludeDepPatterns: 'excludepattern',
+            excludeDepPrefixes: 'prefix1b',
+            automerge: true,
+          },
+        ],
+      },
+      {
+        packageRules: [
+          {
+            matchPackageNames: [
+              '/pattern/',
+              'prefix1{/,}**',
+              '!excluded',
+              '!/excludepattern/',
+              '!prefix1b{/,}**',
+            ],
+            matchDepNames: [
+              '/pattern/',
+              'prefix1{/,}**',
+              '!excluded',
+              '!/excludepattern/',
+              '!prefix1b{/,}**',
+            ],
+            matchSourceUrls: ['prefix1{/,}**'],
+            automerge: true,
+          },
+        ],
+      },
+    );
+  });
+
   it('should migrate all match/exclude at once', () => {
     expect(PackageRulesMigration).toMigrate(
       {
diff --git a/lib/config/migrations/custom/package-rules-migration.ts b/lib/config/migrations/custom/package-rules-migration.ts
index 8ebfc7ec895b3378d6aa89a08f25b6c4f4e9c399..40fd6b93014a0195d4cf67ffc9d9aff8a1b762f1 100644
--- a/lib/config/migrations/custom/package-rules-migration.ts
+++ b/lib/config/migrations/custom/package-rules-migration.ts
@@ -30,52 +30,57 @@ function renameKeys(packageRule: PackageRule): PackageRule {
 function mergeMatchers(packageRule: PackageRule): PackageRule {
   const newPackageRule: PackageRule = { ...packageRule };
   for (const [key, val] of Object.entries(packageRule)) {
+    const patterns = is.string(val) ? [val] : val;
+
     // depName
     if (key === 'matchDepPrefixes') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchDepNames ??= [];
-        newPackageRule.matchDepNames.push(...val.map((v) => `${v}{/,}**`));
+        newPackageRule.matchDepNames.push(...patterns.map((v) => `${v}{/,}**`));
       }
       delete newPackageRule.matchDepPrefixes;
     }
     if (key === 'matchDepPatterns') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchDepNames ??= [];
-        newPackageRule.matchDepNames.push(...val.map((v) => `/${v}/`));
+        newPackageRule.matchDepNames.push(...patterns.map((v) => `/${v}/`));
       }
       delete newPackageRule.matchDepPatterns;
     }
     if (key === 'excludeDepNames') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchDepNames ??= [];
-        newPackageRule.matchDepNames.push(...val.map((v) => `!${v}`));
+        newPackageRule.matchDepNames.push(...patterns.map((v) => `!${v}`));
       }
       delete newPackageRule.excludeDepNames;
     }
     if (key === 'excludeDepPrefixes') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchDepNames ??= [];
-        newPackageRule.matchDepNames.push(...val.map((v) => `!${v}{/,}**`));
+        newPackageRule.matchDepNames.push(
+          ...patterns.map((v) => `!${v}{/,}**`),
+        );
       }
       delete newPackageRule.excludeDepPrefixes;
     }
     if (key === 'excludeDepPatterns') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchDepNames ??= [];
-        newPackageRule.matchDepNames.push(...val.map((v) => `!/${v}/`));
+        newPackageRule.matchDepNames.push(...patterns.map((v) => `!/${v}/`));
       }
       delete newPackageRule.excludeDepPatterns;
     }
     // packageName
     if (key === 'matchPackagePrefixes') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchPackageNames ??= [];
-        newPackageRule.matchPackageNames.push(...val.map((v) => `${v}{/,}**`));
+        newPackageRule.matchPackageNames.push(
+          ...patterns.map((v) => `${v}{/,}**`),
+        );
       }
       delete newPackageRule.matchPackagePrefixes;
     }
     if (key === 'matchPackagePatterns') {
-      const patterns = is.string(val) ? [val] : val;
       if (is.array(patterns, is.string)) {
         newPackageRule.matchPackageNames ??= [];
         newPackageRule.matchPackageNames.push(
@@ -90,39 +95,45 @@ function mergeMatchers(packageRule: PackageRule): PackageRule {
       delete newPackageRule.matchPackagePatterns;
     }
     if (key === 'excludePackageNames') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchPackageNames ??= [];
-        newPackageRule.matchPackageNames.push(...val.map((v) => `!${v}`));
+        newPackageRule.matchPackageNames.push(...patterns.map((v) => `!${v}`));
       }
       delete newPackageRule.excludePackageNames;
     }
     if (key === 'excludePackagePrefixes') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchPackageNames ??= [];
-        newPackageRule.matchPackageNames.push(...val.map((v) => `!${v}{/,}**`));
+        newPackageRule.matchPackageNames.push(
+          ...patterns.map((v) => `!${v}{/,}**`),
+        );
       }
       delete newPackageRule.excludePackagePrefixes;
     }
     if (key === 'excludePackagePatterns') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchPackageNames ??= [];
-        newPackageRule.matchPackageNames.push(...val.map((v) => `!/${v}/`));
+        newPackageRule.matchPackageNames.push(
+          ...patterns.map((v) => `!/${v}/`),
+        );
       }
       delete newPackageRule.excludePackagePatterns;
     }
     // sourceUrl
     if (key === 'matchSourceUrlPrefixes') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchSourceUrls ??= [];
-        newPackageRule.matchSourceUrls.push(...val.map((v) => `${v}{/,}**`));
+        newPackageRule.matchSourceUrls.push(
+          ...patterns.map((v) => `${v}{/,}**`),
+        );
       }
       delete newPackageRule.matchSourceUrlPrefixes;
     }
     // repository
     if (key === 'excludeRepositories') {
-      if (is.array(val, is.string)) {
+      if (is.array(patterns, is.string)) {
         newPackageRule.matchRepositories ??= [];
-        newPackageRule.matchRepositories.push(...val.map((v) => `!${v}`));
+        newPackageRule.matchRepositories.push(...patterns.map((v) => `!${v}`));
       }
       delete newPackageRule.excludeRepositories;
     }