diff --git a/lib/manager/npm/registry.js b/lib/manager/npm/registry.js
index 5f8bd8773a1f787a356af81b7d8f702231cf7439..c18f6d1dd9618f14a04b582b2cf431f863c3a0e0 100644
--- a/lib/manager/npm/registry.js
+++ b/lib/manager/npm/registry.js
@@ -108,11 +108,21 @@ async function getDependency(name) {
       logger.info({ err, name }, `Dependency not found`);
       return null;
     }
+    if (err.name === 'ParseError') {
+      // Registry returned a 200 OK but got failed to parse it
+      logger.warn({ err }, 'npm registry failure: ParseError');
+      throw new Error('registry-failure');
+    }
+    if (err.statusCode === 429) {
+      // This is bad if it ever happens, so we should error
+      logger.error({ err }, 'npm registry failure: too many requests');
+      throw new Error('registry-failure');
+    }
     if (err.statusCode >= 500 && err.statusCode < 600) {
-      logger.info({ err }, 'npm registry failure');
+      logger.warn({ err }, 'npm registry failure: internal error');
       throw new Error('registry-failure');
     }
-    logger.warn({ err, name }, 'Unknown npm lookup error');
-    return null;
+    logger.warn({ err, name }, 'npm registry failures: Unknown error');
+    throw new Error('registry-failure');
   }
 }
diff --git a/test/manager/npm/__snapshots__/registry.spec.js.snap b/test/manager/npm/__snapshots__/registry.spec.js.snap
index d35564e3143c9b020ff3e0520235ec9afa720a6f..2220264b22e7844f6496bfd13912609dd4514a79 100644
--- a/test/manager/npm/__snapshots__/registry.spec.js.snap
+++ b/test/manager/npm/__snapshots__/registry.spec.js.snap
@@ -1,6 +1,21 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`api/npm should fetch package info from custom registry 1`] = `null`;
+exports[`api/npm should fetch package info from custom registry 1`] = `
+Object {
+  "dist-tags": Object {
+    "latest": "0.0.1",
+  },
+  "homepage": undefined,
+  "name": undefined,
+  "renovate-config": undefined,
+  "repositoryUrl": undefined,
+  "versions": Object {
+    "0.0.1": Object {
+      "time": "",
+    },
+  },
+}
+`;
 
 exports[`api/npm should fetch package info from npm 1`] = `
 Object {
@@ -81,7 +96,7 @@ Object {
   "repositoryUrl": undefined,
   "versions": Object {
     "0.0.1": Object {
-      "time": "",
+      "time": "2017-01-01T12:00:00.000Z",
     },
   },
 }
diff --git a/test/manager/npm/registry.spec.js b/test/manager/npm/registry.spec.js
index a775a16af4aa453dffbffb0e03a0bdeb25176cee..498085728aa71a0749c488a6229bcc9fd3b600d7 100644
--- a/test/manager/npm/registry.spec.js
+++ b/test/manager/npm/registry.spec.js
@@ -59,6 +59,30 @@ describe('api/npm', () => {
     const res = await npm.getDependency('foobar');
     expect(res).toBeNull();
   });
+  it('should throw error for unparseable', async () => {
+    nock('https://registry.npmjs.org')
+      .get('/foobar')
+      .reply(200, 'oops');
+    let e;
+    try {
+      await npm.getDependency('foobar');
+    } catch (err) {
+      e = err;
+    }
+    expect(e).toBeDefined();
+  });
+  it('should throw error for 429', async () => {
+    nock('https://registry.npmjs.org')
+      .get('/foobar')
+      .reply(429);
+    let e;
+    try {
+      await npm.getDependency('foobar');
+    } catch (err) {
+      e = err;
+    }
+    expect(e).toBeDefined();
+  });
   it('should throw error for 5xx', async () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
@@ -71,6 +95,18 @@ describe('api/npm', () => {
     }
     expect(e).toBeDefined();
   });
+  it('should throw error for others', async () => {
+    nock('https://registry.npmjs.org')
+      .get('/foobar')
+      .reply(451);
+    let e;
+    try {
+      await npm.getDependency('foobar');
+    } catch (err) {
+      e = err;
+    }
+    expect(e).toBeDefined();
+  });
   it('should send an authorization header if provided', async () => {
     registryAuthToken.mockImplementation(() => ({
       type: 'Basic',
@@ -92,14 +128,6 @@ describe('api/npm', () => {
     process.env.NPM_TOKEN = oldToken;
     expect(res).toMatchSnapshot();
   });
-  it('should fetch package info from custom registry', async () => {
-    nock('https://registry.npmjs.org')
-      .get('/foobar')
-      .reply(200, npmResponse);
-    npm.setNpmrc('registry=https://npm.mycustomregistry.com/');
-    const res = await npm.getDependency('foobar');
-    expect(res).toMatchSnapshot();
-  });
   it('should use default registry if missing from npmrc', async () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
@@ -126,4 +154,12 @@ describe('api/npm', () => {
     expect(res1).not.toBe(null);
     expect(res1).toEqual(res2);
   });
+  it('should fetch package info from custom registry', async () => {
+    nock('https://npm.mycustomregistry.com')
+      .get('/foobar')
+      .reply(200, npmResponse);
+    npm.setNpmrc('registry=https://npm.mycustomregistry.com/');
+    const res = await npm.getDependency('foobar');
+    expect(res).toMatchSnapshot();
+  });
 });