diff --git a/lib/datasource/github.js b/lib/datasource/github.js
index 3bbceb9d40d9db4c011ce9864b944f18b693d78e..ab1e6664d449698257ebc46eab80b13504e3907e 100644
--- a/lib/datasource/github.js
+++ b/lib/datasource/github.js
@@ -52,13 +52,10 @@ async function getDependency(purl, config) {
   versions = versions.filter(isVersion).sort(sortVersions);
   const dependency = {
     repositoryUrl: 'https://github.com/' + repo,
-    versions: {},
   };
-  versions.forEach(version => {
-    const v = options.sanitize === 'true' ? isVersion(version) : version;
-    dependency.versions[v] = {
-      gitRef: version,
-    };
-  });
+  dependency.releases = versions.map(version => ({
+    version: options.sanitize === 'true' ? isVersion(version) : version,
+    gitRef: version,
+  }));
   return dependency;
 }
diff --git a/lib/datasource/npm.js b/lib/datasource/npm.js
index 1fbccb2471acdca4d016c415ae2c99babd4e3c29..7d832a21a1df1f6ebf07cddac57ef3151fe845a2 100644
--- a/lib/datasource/npm.js
+++ b/lib/datasource/npm.js
@@ -187,21 +187,23 @@ async function getDependencyInner(name, retries = 5) {
       latestVersion: res['dist-tags'].latest,
       repositoryUrl,
       versions: {},
-      'dist-tags': res['dist-tags'],
       'renovate-config': latestVersion['renovate-config'],
     };
-    Object.keys(res.versions)
+    const versions = Object.keys(res.versions)
       .filter(isVersion)
-      .sort(sortVersions)
-      .forEach(version => {
-        const v = {};
-        if (res.time && res.time[version]) {
-          v.gitRef = res.versions[version].gitHead;
-          v.time = res.time[version];
-          v.canBeUnpublished = moment().diff(moment(v.time), 'days') === 0;
-        }
-        dep.versions[version] = v;
-      });
+      .sort(sortVersions);
+    dep.releases = versions.map(version => {
+      const release = {
+        version,
+        gitRef: res.versions[version].gitHead,
+      };
+      if (res.time && res.time[version]) {
+        release.time = res.time[version];
+        release.canBeUnpublished =
+          moment().diff(moment(release.time), 'days') === 0;
+      }
+      return release;
+    });
     logger.trace({ dep }, 'dep');
     memcache[name] = dep;
     return dep;
diff --git a/lib/datasource/packagist.js b/lib/datasource/packagist.js
index b332ec8035ccd61edb389d150a2ba95c8ee2a854..3edc9a72b2ad94f4b575d3006b295e25c71f2d7d 100644
--- a/lib/datasource/packagist.js
+++ b/lib/datasource/packagist.js
@@ -30,19 +30,19 @@ async function getDependency(purl) {
     if (res.repository) {
       dep.repositoryUrl = parse(res.repository);
     }
-
-    Object.keys(res.versions)
+    const versions = Object.keys(res.versions)
       .filter(isVersion)
-      .sort(sortVersions)
-      .forEach(version => {
-        const v = res.versions[version];
-        dep.homepage = dep.homepage || v.homepage;
-        const sanitize = isVersion;
-        dep.versions[sanitize(version)] = {
-          gitRef: version,
-          time: v.time,
-        };
-      });
+      .sort(sortVersions);
+
+    dep.releases = versions.map(version => {
+      const release = res.versions[version];
+      dep.homepage = dep.homepage || release.homepage;
+      return {
+        version,
+        gitRef: version,
+        time: release.time,
+      };
+    });
     dep.homepage = dep.homepage || res.repository;
     logger.trace({ dep }, 'dep');
     return dep;
diff --git a/lib/datasource/pypi.js b/lib/datasource/pypi.js
index 877c07820a27050d08838d004724a8ac7cae3428..dd35de0932465b589d8c208a93d2c06c7818c8b6 100644
--- a/lib/datasource/pypi.js
+++ b/lib/datasource/pypi.js
@@ -24,16 +24,15 @@ async function getDependency(purl) {
         dependency.homepage = dep.info.home_page;
       }
     }
-    dependency.versions = {};
+    dependency.releases = [];
     if (dep.releases) {
-      Object.keys(dep.releases)
+      const versions = Object.keys(dep.releases)
         .filter(isVersion)
-        .sort(sortVersions)
-        .forEach(release => {
-          dependency.versions[release] = {
-            date: (dep.releases[release][0] || {}).upload_time,
-          };
-        });
+        .sort(sortVersions);
+      dependency.releases = versions.map(version => ({
+        version,
+        date: (dep.releases[version][0] || {}).upload_time,
+      }));
     }
     return dependency;
   } catch (err) {
diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js
index b52bcc327d58b4f7626f1853ff35414c64541775..70218f96513d39f3aa0c794c38400624536e4bb6 100644
--- a/lib/manager/travis/package.js
+++ b/lib/manager/travis/package.js
@@ -1,5 +1,5 @@
 const { isEqual } = require('lodash');
-const { getDependency } = require('../../datasource/github');
+const { getDependency } = require('../../datasource');
 const versioning = require('../../versioning');
 const is = require('@sindresorhus/is');
 
@@ -37,11 +37,12 @@ async function getPackageUpdates(config) {
     .sort((a, b) => a - b);
   const newMajor = newValue[newValue.length - 1];
   if (config.rangeStrategy === 'pin' || isVersion(config.currentValue[0])) {
-    const releases = Object.keys(
-      (await getDependency('nodejs/node', { sanitize: 'true' })).versions
-    );
-    newValue = newValue.map(version =>
-      maxSatisfyingVersion(releases, `${version}`)
+    const versions = (await getDependency(
+      'pkg:github/nodejs/node?sanitize=true',
+      config
+    )).releases.map(release => release.version);
+    newValue = newValue.map(value =>
+      maxSatisfyingVersion(versions, `${value}`)
     );
   }
   if (is.string(config.currentValue[0])) {
diff --git a/lib/workers/repository/process/lookup/index.js b/lib/workers/repository/process/lookup/index.js
index 0b314fa1c0181f2c201b5871c432f3e40368a3e5..e6d257c6c8977cc3b271b7c40fded4316bb41356 100644
--- a/lib/workers/repository/process/lookup/index.js
+++ b/lib/workers/repository/process/lookup/index.js
@@ -12,6 +12,7 @@ async function lookupUpdates(config) {
   const { depName, currentValue } = config;
   logger.debug({ depName, currentValue }, 'lookupUpdates');
   const {
+    equals,
     getMajor,
     getMinor,
     isGreaterThan,
@@ -34,10 +35,11 @@ async function lookupUpdates(config) {
     // TODO: return an object
     return [result];
   }
+  const { releases } = dependency;
   // Filter out any results from datasource that don't comply with our versioning scheme
-  const allVersions = Object.keys(dependency.versions).filter(v =>
-    isVersion(v)
-  );
+  const allVersions = releases
+    .map(release => release.version)
+    .filter(v => isVersion(v));
   // istanbul ignore if
   if (allVersions.length === 0) {
     const message = `No versions returned from registry for this package`;
@@ -112,7 +114,9 @@ async function lookupUpdates(config) {
       update.isRange = true;
     }
 
-    update.canBeUnpublished = dependency.versions[toVersion].canBeUnpublished;
+    update.canBeUnpublished = releases.find(release =>
+      equals(release.version, toVersion)
+    ).canBeUnpublished;
 
     const bucket = getBucket(config, update);
     if (buckets[bucket]) {
diff --git a/test/datasource/__snapshots__/github.spec.js.snap b/test/datasource/__snapshots__/github.spec.js.snap
index fa56ea87e2524c310ea4a864b097994a028efcb2..982b8589b03afb35d03ec4bacf6e26aa03a634bf 100644
--- a/test/datasource/__snapshots__/github.spec.js.snap
+++ b/test/datasource/__snapshots__/github.spec.js.snap
@@ -2,28 +2,32 @@
 
 exports[`datasource/github getDependency returns cleaned tags 1`] = `
 Object {
-  "repositoryUrl": "https://github.com/some/dep",
-  "versions": Object {
-    "1.0.0": Object {
+  "releases": Array [
+    Object {
       "gitRef": "1.0.0",
+      "version": "1.0.0",
     },
-    "1.1.0": Object {
+    Object {
       "gitRef": "v1.1.0",
+      "version": "1.1.0",
     },
-  },
+  ],
+  "repositoryUrl": "https://github.com/some/dep",
 }
 `;
 
 exports[`datasource/github getDependency returns releases 1`] = `
 Object {
-  "repositoryUrl": "https://github.com/some/dep",
-  "versions": Object {
-    "1.0.0": Object {
+  "releases": Array [
+    Object {
       "gitRef": "1.0.0",
+      "version": "1.0.0",
     },
-    "v1.1.0": Object {
+    Object {
       "gitRef": "v1.1.0",
+      "version": "v1.1.0",
     },
-  },
+  ],
+  "repositoryUrl": "https://github.com/some/dep",
 }
 `;
diff --git a/test/datasource/__snapshots__/npm.spec.js.snap b/test/datasource/__snapshots__/npm.spec.js.snap
index 17b062194f79adc3c760e386a7d3bc1d455838f5..94158b299c88a941f586acf6f9ceba481dd27455 100644
--- a/test/datasource/__snapshots__/npm.spec.js.snap
+++ b/test/datasource/__snapshots__/npm.spec.js.snap
@@ -2,122 +2,124 @@
 
 exports[`api/npm should fetch package info from custom registry 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://github.com/renovateapp/dummy",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-07T07:21:53+02:00",
+      "version": "0.0.2",
     },
-  },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://github.com/renovateapp/dummy",
+  "versions": Object {},
 }
 `;
 
 exports[`api/npm should fetch package info from npm 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://github.com/renovateapp/dummy",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-07T07:21:53+02:00",
+      "version": "0.0.2",
     },
-  },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://github.com/renovateapp/dummy",
+  "versions": Object {},
 }
 `;
 
 exports[`api/npm should handle no time 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://github.com/renovateapp/dummy",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {},
-  },
+    Object {
+      "gitRef": undefined,
+      "version": "0.0.2",
+    },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://github.com/renovateapp/dummy",
+  "versions": Object {},
 }
 `;
 
 exports[`api/npm should handle purl 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://github.com/renovateapp/dummy",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-07T07:21:53+02:00",
+      "version": "0.0.2",
     },
-  },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://github.com/renovateapp/dummy",
+  "versions": Object {},
 }
 `;
 
 exports[`api/npm should replace any environment variable in npmrc 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://github.com/renovateapp/dummy",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-07T07:21:53+02:00",
+      "version": "0.0.2",
     },
-  },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://github.com/renovateapp/dummy",
+  "versions": Object {},
 }
 `;
 
@@ -125,100 +127,100 @@ exports[`api/npm should retry when 408 or 5xx 1`] = `null`;
 
 exports[`api/npm should send an authorization header if provided 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://github.com/renovateapp/dummy",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-07T07:21:53+02:00",
+      "version": "0.0.2",
     },
-  },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://github.com/renovateapp/dummy",
+  "versions": Object {},
 }
 `;
 
 exports[`api/npm should use NPM_TOKEN if provided 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://github.com/renovateapp/dummy",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-07T07:21:53+02:00",
+      "version": "0.0.2",
     },
-  },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://github.com/renovateapp/dummy",
+  "versions": Object {},
 }
 `;
 
 exports[`api/npm should use default registry if missing from npmrc 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://github.com/renovateapp/dummy",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-07T07:21:53+02:00",
+      "version": "0.0.2",
     },
-  },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://github.com/renovateapp/dummy",
+  "versions": Object {},
 }
 `;
 
 exports[`api/npm should use homepage 1`] = `
 Object {
-  "dist-tags": Object {
-    "latest": "0.0.1",
-  },
   "homepage": "https://google.com",
   "latestVersion": "0.0.1",
   "name": undefined,
-  "renovate-config": undefined,
-  "repositoryUrl": "https://google.com",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-06T07:21:53+02:00",
+      "version": "0.0.1",
     },
-    "0.0.2": Object {
+    Object {
       "canBeUnpublished": false,
       "gitRef": undefined,
       "time": "2018-05-07T07:21:53+02:00",
+      "version": "0.0.2",
     },
-  },
+  ],
+  "renovate-config": undefined,
+  "repositoryUrl": "https://google.com",
+  "versions": Object {},
 }
 `;
diff --git a/test/datasource/__snapshots__/packagist.spec.js.snap b/test/datasource/__snapshots__/packagist.spec.js.snap
index 6c5d732ffcb62616a9c7de7e445b951100cda850..d932a8c2e730dba8f3d0ecfc7fc682d55ee08b8c 100644
--- a/test/datasource/__snapshots__/packagist.spec.js.snap
+++ b/test/datasource/__snapshots__/packagist.spec.js.snap
@@ -4,40 +4,49 @@ exports[`datasource/packagist getDependency processes real data 1`] = `
 Object {
   "homepage": "https://github.com/cristianvuolo/uploader",
   "name": "cristianvuolo/uploader",
-  "repositoryUrl": "https://github.com/cristianvuolo/uploader",
-  "versions": Object {
-    "1.0.0": Object {
+  "releases": Array [
+    Object {
       "gitRef": "1.0.0",
       "time": "2017-02-07T20:01:41+00:00",
+      "version": "1.0.0",
     },
-    "1.0.1": Object {
+    Object {
       "gitRef": "1.0.1",
       "time": "2017-02-07T20:10:08+00:00",
+      "version": "1.0.1",
     },
-    "1.0.3": Object {
+    Object {
       "gitRef": "1.0.3",
       "time": "2017-07-11T16:52:54+00:00",
+      "version": "1.0.3",
     },
-    "1.0.4": Object {
+    Object {
       "gitRef": "1.0.4",
       "time": "2017-08-02T13:08:31+00:00",
+      "version": "1.0.4",
     },
-    "1.0.5": Object {
+    Object {
       "gitRef": "1.0.5",
       "time": "2017-08-02T13:23:33+00:00",
+      "version": "1.0.5",
     },
-    "1.0.6": Object {
+    Object {
       "gitRef": "1.0.6",
       "time": "2018-01-25T18:57:17+00:00",
+      "version": "1.0.6",
     },
-    "1.0.7": Object {
+    Object {
       "gitRef": "1.0.7",
       "time": "2018-02-19T12:22:34+00:00",
+      "version": "1.0.7",
     },
-    "1.0.8": Object {
+    Object {
       "gitRef": "1.0.8",
       "time": "2018-03-14T17:40:06+00:00",
+      "version": "1.0.8",
     },
-  },
+  ],
+  "repositoryUrl": "https://github.com/cristianvuolo/uploader",
+  "versions": Object {},
 }
 `;
diff --git a/test/datasource/__snapshots__/pypi.spec.js.snap b/test/datasource/__snapshots__/pypi.spec.js.snap
index b53e1ebce6c914843027202bc379c9d49aead7a2..bced52c0d137984f2153137d848575609b3c5163 100644
--- a/test/datasource/__snapshots__/pypi.spec.js.snap
+++ b/test/datasource/__snapshots__/pypi.spec.js.snap
@@ -2,81 +2,103 @@
 
 exports[`datasource/pypi getDependency processes real data 1`] = `
 Object {
-  "repository_url": "https://github.com/Azure/azure-cli",
-  "versions": Object {
-    "0.0.1": Object {
+  "releases": Array [
+    Object {
       "date": "2017-04-03T16:55:14",
+      "version": "0.0.1",
     },
-    "0.0.10": Object {
-      "date": "2017-09-22T23:47:59",
-    },
-    "0.0.11": Object {
-      "date": "2017-10-24T02:14:07",
-    },
-    "0.0.12": Object {
-      "date": "2017-11-14T18:31:57",
-    },
-    "0.0.13": Object {
-      "date": "2017-12-05T18:57:54",
-    },
-    "0.0.14": Object {
-      "date": "2018-01-05T21:26:03",
-    },
-    "0.0.2": Object {
+    Object {
       "date": "2017-04-17T20:32:30",
+      "version": "0.0.2",
     },
-    "0.0.3": Object {
+    Object {
       "date": "2017-04-28T21:18:54",
+      "version": "0.0.3",
     },
-    "0.0.4": Object {
+    Object {
       "date": "2017-05-09T21:36:51",
+      "version": "0.0.4",
     },
-    "0.0.5": Object {
+    Object {
       "date": "2017-05-30T23:13:49",
+      "version": "0.0.5",
     },
-    "0.0.6": Object {
+    Object {
       "date": "2017-06-13T22:21:05",
+      "version": "0.0.6",
     },
-    "0.0.7": Object {
+    Object {
       "date": "2017-06-21T22:12:36",
+      "version": "0.0.7",
     },
-    "0.0.8": Object {
+    Object {
       "date": "2017-07-07T16:22:26",
+      "version": "0.0.8",
     },
-    "0.0.9": Object {
+    Object {
       "date": "2017-08-28T20:14:33",
+      "version": "0.0.9",
     },
-    "0.1.0": Object {
+    Object {
+      "date": "2017-09-22T23:47:59",
+      "version": "0.0.10",
+    },
+    Object {
+      "date": "2017-10-24T02:14:07",
+      "version": "0.0.11",
+    },
+    Object {
+      "date": "2017-11-14T18:31:57",
+      "version": "0.0.12",
+    },
+    Object {
+      "date": "2017-12-05T18:57:54",
+      "version": "0.0.13",
+    },
+    Object {
+      "date": "2018-01-05T21:26:03",
+      "version": "0.0.14",
+    },
+    Object {
       "date": "2018-01-17T18:36:39",
+      "version": "0.1.0",
     },
-    "0.1.1": Object {
+    Object {
       "date": "2018-01-31T18:05:22",
+      "version": "0.1.1",
     },
-    "0.1.2": Object {
+    Object {
       "date": "2018-02-13T18:17:52",
+      "version": "0.1.2",
     },
-    "0.1.3": Object {
+    Object {
       "date": "2018-03-13T17:08:20",
+      "version": "0.1.3",
     },
-    "0.1.4": Object {
+    Object {
       "date": "2018-03-27T17:55:25",
+      "version": "0.1.4",
     },
-    "0.1.5": Object {
+    Object {
       "date": "2018-04-10T17:25:47",
+      "version": "0.1.5",
     },
-    "0.1.6": Object {
+    Object {
       "date": "2018-05-07T17:59:09",
+      "version": "0.1.6",
     },
-    "0.1.7": Object {
+    Object {
       "date": "2018-05-22T17:25:23",
+      "version": "0.1.7",
     },
-  },
+  ],
+  "repository_url": "https://github.com/Azure/azure-cli",
 }
 `;
 
 exports[`datasource/pypi getDependency returns non-github home_page 1`] = `
 Object {
   "homepage": "https://microsoft.com",
-  "versions": Object {},
+  "releases": Array [],
 }
 `;
diff --git a/test/datasource/github.spec.js b/test/datasource/github.spec.js
index a173731d2aae10cd0f45d4a36605d4f5664da565..2ea50f72f9ff17cb8b59a35c560175280135201a 100644
--- a/test/datasource/github.spec.js
+++ b/test/datasource/github.spec.js
@@ -18,8 +18,10 @@ describe('datasource/github', () => {
         'pkg:github/some/dep?sanitize=true'
       );
       expect(res).toMatchSnapshot();
-      expect(Object.keys(res.versions)).toHaveLength(2);
-      expect(res.versions['1.1.0']).toBeDefined();
+      expect(res.releases).toHaveLength(2);
+      expect(
+        res.releases.find(release => release.version === '1.1.0')
+      ).toBeDefined();
     });
     it('returns releases', async () => {
       const body = [
@@ -33,8 +35,10 @@ describe('datasource/github', () => {
         'pkg:github/some/dep?ref=release'
       );
       expect(res).toMatchSnapshot();
-      expect(Object.keys(res.versions)).toHaveLength(2);
-      expect(res.versions['v1.1.0']).toBeDefined();
+      expect(res.releases).toHaveLength(2);
+      expect(
+        res.releases.find(release => release.version === 'v1.1.0')
+      ).toBeDefined();
     });
     it('returns null for invalid ref', async () => {
       expect(
diff --git a/test/datasource/npm.spec.js b/test/datasource/npm.spec.js
index a1d288445905cfff284b3bb3a6cd06b8915c8655..e819c88638888c1260b2cc2c50814303fd5d2e15 100644
--- a/test/datasource/npm.spec.js
+++ b/test/datasource/npm.spec.js
@@ -8,6 +8,10 @@ jest.mock('delay');
 
 let npmResponse;
 
+function getRelease(dependency, version) {
+  return dependency.releases.find(release => release.version === version);
+}
+
 describe('api/npm', () => {
   delete process.env.NPM_TOKEN;
   beforeEach(() => {
@@ -53,8 +57,8 @@ describe('api/npm', () => {
       .reply(200, npmResponse);
     const res = await npm.getDependency('foobar');
     expect(res).toMatchSnapshot();
-    expect(res.versions['0.0.1'].canBeUnpublished).toBe(false);
-    expect(res.versions['0.0.2'].canBeUnpublished).toBe(false);
+    expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
+    expect(getRelease(res, '0.0.2').canBeUnpublished).toBe(false);
   });
   it('should handle purl', async () => {
     nock('https://registry.npmjs.org')
@@ -70,8 +74,8 @@ describe('api/npm', () => {
       .reply(200, npmResponse);
     const res = await npm.getDependency('foobar');
     expect(res).toMatchSnapshot();
-    expect(res.versions['0.0.1'].canBeUnpublished).toBe(false);
-    expect(res.versions['0.0.2'].canBeUnpublished).toBeUndefined();
+    expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
+    expect(getRelease(res, '0.0.2').canBeUnpublished).toBeUndefined();
   });
   it('should return canBeUnpublished=true', async () => {
     npmResponse.time['0.0.2'] = moment()
@@ -81,8 +85,8 @@ describe('api/npm', () => {
       .get('/foobar')
       .reply(200, npmResponse);
     const res = await npm.getDependency('foobar');
-    expect(res.versions['0.0.1'].canBeUnpublished).toBe(false);
-    expect(res.versions['0.0.2'].canBeUnpublished).toBe(true);
+    expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
+    expect(getRelease(res, '0.0.2').canBeUnpublished).toBe(true);
   });
   it('should use homepage', async () => {
     const npmResponseHomepage = { ...npmResponse };
diff --git a/test/manager/travis/package.spec.js b/test/manager/travis/package.spec.js
index 2d58c173b98f3976710ae217018f6191cf5ff825..2d59bbf41fd93ddca031b87b0b872b655e4bc847 100644
--- a/test/manager/travis/package.spec.js
+++ b/test/manager/travis/package.spec.js
@@ -35,14 +35,26 @@ describe('lib/manager/node/package', () => {
       config.currentValue = ['6.1.0', '8.4.0'];
       config.supportPolicy = ['lts'];
       githubDatasource.getDependency.mockReturnValueOnce({
-        versions: {
-          '4.4.4': {},
-          '5.5.5': {},
-          '6.11.0': {},
-          '7.0.0': {},
-          '8.9.4': {},
-          '9.5.0': {},
-        },
+        releases: [
+          {
+            version: '4.4.4',
+          },
+          {
+            version: '5.5.5',
+          },
+          {
+            version: '6.11.0',
+          },
+          {
+            version: '7.0.0',
+          },
+          {
+            version: '8.9.4',
+          },
+          {
+            version: '9.5.0',
+          },
+        ],
       });
       expect(await node.getPackageUpdates(config)).toMatchSnapshot();
     });