diff --git a/lib/datasource/packagist.js b/lib/datasource/packagist.js
index 5855c20d8f906fd3d4a38deaff7a497fe3c1e038..5e41c4981f7c6f5b210b9f2df2ba578c2c5a1cde 100644
--- a/lib/datasource/packagist.js
+++ b/lib/datasource/packagist.js
@@ -187,6 +187,8 @@ async function getPkgReleases(purl, config = {}) {
     for (const regUrl of config.registryUrls) {
       if (regUrl.type === 'composer') {
         regUrls.push(regUrl.url);
+      } else if (regUrl.type === 'package') {
+        logger.info({ regUrl }, 'Skipping package repository entry');
       } else if (regUrl['packagist.org'] !== false) {
         logger.info({ regUrl }, 'Unsupported Packagist registry URL');
       }
diff --git a/lib/manager/composer/extract.js b/lib/manager/composer/extract.js
index c26c80c26e77b362d2056455111905c4633e143e..3649c1a480d27b3293b2402c5d1616b4db706e87 100644
--- a/lib/manager/composer/extract.js
+++ b/lib/manager/composer/extract.js
@@ -1,3 +1,4 @@
+const is = require('@sindresorhus/is');
 const semverComposer = require('../../versioning')('semverComposer');
 
 module.exports = {
@@ -58,7 +59,23 @@ async function extractDependencies(content, fileName) {
   }
   const res = { deps, composerLock };
   if (packageJson.repositories) {
-    res.registryUrls = packageJson.repositories;
+    if (is.array(packageJson.repositories)) {
+      res.registryUrls = packageJson.repositories;
+    } else if (is.object(packageJson.repositories)) {
+      try {
+        res.registryUrls = [];
+        for (const repository of Object.values(packageJson.repositories)) {
+          res.registryUrls.push(repository);
+        }
+      } catch (err) /* istanbul ignore next */ {
+        logger.info({ err }, 'Error extracting composer repositories');
+      }
+    } /* istanbul ignore next */ else {
+      logger.info(
+        { repositories: packageJson.repositories },
+        'Unknown composer repositories'
+      );
+    }
   }
   return res;
 }
diff --git a/test/_fixtures/composer/composer3.json b/test/_fixtures/composer/composer3.json
new file mode 100644
index 0000000000000000000000000000000000000000..3afd092fb99034925b5114619c96f29ec566b64f
--- /dev/null
+++ b/test/_fixtures/composer/composer3.json
@@ -0,0 +1,66 @@
+{
+    "name": "asha23/arlo-timber-framework",
+    "type": "project",
+    "license": "MIT",
+    "description": "A Composer Framework to help you get WordPress with Timber up and running in around a minute",
+    "authors": [{
+        "name": "Ash Whiting",
+        "email": "ash_whiting@hotmail.com"
+    }],
+    "keywords": [
+        "Arlo", "wordpress framework", "base theme", "wordpress", "composer", "vagrant", "wp"
+    ],
+    "repositories": {
+        "wp-packagist": {
+            "type": "composer",
+            "url": "https://wpackagist.org"
+        },
+        "theme": {
+            "type": "package",
+            "package": {
+                "name": "asha23/wp-seed-timber",
+                "type": "wordpress-theme",
+                "version": "1.2.6",
+                "dist": {
+                    "type": "zip",
+                    "url": "https://github.com/asha23/wp-seed-timber/archive/v1.2.6.zip"
+                }
+            }
+        },
+		"wp-sync-db": {
+			"type": "package",
+			"package": {
+				"name": "wp-sync-db/wp-sync-db",
+				"type": "wordpress-plugin",
+				"version": "1.5",
+				"dist": {
+					"type": "zip",
+					"url": "https://github.com/corysimmons/wp-sync-db/archive/1.6.zip"
+				}
+			}
+		}
+    },
+    "require": {
+        "php": ">=5.5",
+        "composer/installers": "~1.0.12",
+        "johnpbloch/wordpress": "*",
+	    "vlucas/phpdotenv": "^2.0.1",
+	    "oscarotero/env": "^1.0",
+        "wpackagist-plugin/tinymce-advanced": "*",
+        "wpackagist-plugin/acf-content-analysis-for-yoast-seo": "*",
+        "wpackagist-plugin/duplicate-post": "*",
+        "wpackagist-plugin/simple-image-sizes": "*",
+        "wpackagist-plugin/wordpress-seo": "*",
+	    "wpackagist-plugin/timber-library": "*",
+	    "wp-sync-db/wp-sync-db": "*",
+        "asha23/wp-seed-timber": "*"
+    },
+    "extra": {
+        "installer-paths": {
+            "web/content/plugins/{$name}/": ["type:wordpress-plugin"],
+            "web/content/themes/{$name}/": ["type:wordpress-theme"]
+        },
+        "wordpress-install-dir": "web/wp",
+        "content-install-dir": "web/content"
+    }
+}
diff --git a/test/datasource/packagist.spec.js b/test/datasource/packagist.spec.js
index ed3f5b22cf7ccc050bdedf3feb0d25ee200ca769..72cda449222f7130ec7aed3e1e7c691deb28a3c4 100644
--- a/test/datasource/packagist.spec.js
+++ b/test/datasource/packagist.spec.js
@@ -29,6 +29,18 @@ describe('datasource/packagist', () => {
           {
             type: 'unknown',
           },
+          {
+            type: 'package',
+            package: {
+              name: 'abc/def',
+              type: 'wordpress-theme',
+              version: '1.2.6',
+              dist: {
+                type: 'zip',
+                url: 'https://github.com/abc/def/archive/v1.2.6.zip',
+              },
+            },
+          },
           {
             'packagist.org': false,
           },
diff --git a/test/manager/composer/__snapshots__/extract.spec.js.snap b/test/manager/composer/__snapshots__/extract.spec.js.snap
index 3dda6c64e3d20998bed5522c5e94094d065abce6..7586de6823c919661c15db436a47deaf7e11417b 100644
--- a/test/manager/composer/__snapshots__/extract.spec.js.snap
+++ b/test/manager/composer/__snapshots__/extract.spec.js.snap
@@ -500,6 +500,145 @@ Object {
 }
 `;
 
+exports[`lib/manager/composer/extract extractDependencies() extracts object registryUrls 1`] = `
+Object {
+  "composerLock": false,
+  "deps": Array [
+    Object {
+      "currentValue": ">=5.5",
+      "depName": "php",
+      "depType": "require",
+      "purl": "pkg:packagist/php",
+      "skipReason": "unsupported",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "~1.0.12",
+      "depName": "composer/installers",
+      "depType": "require",
+      "purl": "pkg:packagist/composer/installers",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "johnpbloch/wordpress",
+      "depType": "require",
+      "purl": "pkg:packagist/johnpbloch/wordpress",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "^2.0.1",
+      "depName": "vlucas/phpdotenv",
+      "depType": "require",
+      "purl": "pkg:packagist/vlucas/phpdotenv",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "^1.0",
+      "depName": "oscarotero/env",
+      "depType": "require",
+      "purl": "pkg:packagist/oscarotero/env",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "wpackagist-plugin/tinymce-advanced",
+      "depType": "require",
+      "purl": "pkg:packagist/wpackagist-plugin/tinymce-advanced",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "wpackagist-plugin/acf-content-analysis-for-yoast-seo",
+      "depType": "require",
+      "purl": "pkg:packagist/wpackagist-plugin/acf-content-analysis-for-yoast-seo",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "wpackagist-plugin/duplicate-post",
+      "depType": "require",
+      "purl": "pkg:packagist/wpackagist-plugin/duplicate-post",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "wpackagist-plugin/simple-image-sizes",
+      "depType": "require",
+      "purl": "pkg:packagist/wpackagist-plugin/simple-image-sizes",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "wpackagist-plugin/wordpress-seo",
+      "depType": "require",
+      "purl": "pkg:packagist/wpackagist-plugin/wordpress-seo",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "wpackagist-plugin/timber-library",
+      "depType": "require",
+      "purl": "pkg:packagist/wpackagist-plugin/timber-library",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "wp-sync-db/wp-sync-db",
+      "depType": "require",
+      "purl": "pkg:packagist/wp-sync-db/wp-sync-db",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+    Object {
+      "currentValue": "*",
+      "depName": "asha23/wp-seed-timber",
+      "depType": "require",
+      "purl": "pkg:packagist/asha23/wp-seed-timber",
+      "skipReason": "any-version",
+      "versionScheme": "semverComposer",
+    },
+  ],
+  "registryUrls": Array [
+    Object {
+      "type": "composer",
+      "url": "https://wpackagist.org",
+    },
+    Object {
+      "package": Object {
+        "dist": Object {
+          "type": "zip",
+          "url": "https://github.com/asha23/wp-seed-timber/archive/v1.2.6.zip",
+        },
+        "name": "asha23/wp-seed-timber",
+        "type": "wordpress-theme",
+        "version": "1.2.6",
+      },
+      "type": "package",
+    },
+    Object {
+      "package": Object {
+        "dist": Object {
+          "type": "zip",
+          "url": "https://github.com/corysimmons/wp-sync-db/archive/1.6.zip",
+        },
+        "name": "wp-sync-db/wp-sync-db",
+        "type": "wordpress-plugin",
+        "version": "1.5",
+      },
+      "type": "package",
+    },
+  ],
+}
+`;
+
 exports[`lib/manager/composer/extract extractDependencies() extracts registryUrls 1`] = `
 Object {
   "composerLock": false,
diff --git a/test/manager/composer/extract.spec.js b/test/manager/composer/extract.spec.js
index 88985ff3ee99d83b29c85416a6fdacbea67aab46..915b513cb1af69fce00b4949957ef6dd933a7e6c 100644
--- a/test/manager/composer/extract.spec.js
+++ b/test/manager/composer/extract.spec.js
@@ -11,6 +11,10 @@ const requirements2 = fs.readFileSync(
   'test/_fixtures/composer/composer2.json',
   'utf8'
 );
+const requirements3 = fs.readFileSync(
+  'test/_fixtures/composer/composer3.json',
+  'utf8'
+);
 
 describe('lib/manager/composer/extract', () => {
   describe('extractDependencies()', () => {
@@ -33,6 +37,11 @@ describe('lib/manager/composer/extract', () => {
       expect(res).toMatchSnapshot();
       expect(res.registryUrls).toHaveLength(1);
     });
+    it('extracts object registryUrls', async () => {
+      const res = await extractDependencies(requirements3, packageFile);
+      expect(res).toMatchSnapshot();
+      expect(res.registryUrls).toHaveLength(3);
+    });
     it('extracts dependencies with lock file', async () => {
       platform.getFile.mockReturnValueOnce('some content');
       const res = await extractDependencies(requirements1, packageFile);