diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts
index 7eab999f78163af817fec31eeb8794aec1761ba1..28055dcc932c04aa9a3d855a6063b0749a0e40b7 100644
--- a/lib/config/migration.spec.ts
+++ b/lib/config/migration.spec.ts
@@ -304,6 +304,23 @@ describe('config/migration', () => {
         migratedConfig.lockFileMaintenance.packageRules[0].respectLatest
       ).toBe(false);
     });
+
+    it('migrates packageRules objects', () => {
+      const config = {
+        packageRules: {
+          packageNames: ['typescript'],
+          updateTypes: ['major'],
+          commitMessage:
+            'fix(package): update peerDependency to accept typescript ^{{newVersion}}',
+        },
+      } as any;
+      const { isMigrated, migratedConfig } = configMigration.migrateConfig(
+        config,
+        defaultConfig
+      );
+      expect(isMigrated).toBe(true);
+      expect(migratedConfig.packageRules).toHaveLength(1);
+    });
     it('migrates node to travis', () => {
       const config: RenovateConfig = {
         node: {
diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index cb2cc7e308d8bc888d0e166aa1f21f6017700ab3..e7b10acfa68246445d90a66b0813b85290244b56 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -109,6 +109,8 @@ export function migrateConfig(
       } else if (parentKey === 'hostRules' && key === 'host') {
         migratedConfig.hostName = val;
         delete migratedConfig.host;
+      } else if (key === 'packageRules' && is.plainObject(val)) {
+        migratedConfig.packageRules = [val];
       } else if (key === 'packageFiles' && is.array(val)) {
         const fileList = [];
         for (const packageFile of val) {