diff --git a/lib/workers/package/versions.js b/lib/workers/package/versions.js
index 0d3f83f87bcc0a5ec9e5a1ca1af8e5c9abb7af56..5c482a08f70f7fd1f87d980f9006149389fdc221 100644
--- a/lib/workers/package/versions.js
+++ b/lib/workers/package/versions.js
@@ -179,6 +179,11 @@ function determineUpgrades(npmDep, config) {
       logger.debug('Found less than range');
     } else if (secondLastSemver.operator === '||') {
       logger.debug('Found an OR range');
+    } else if (secondLastSemver.operator === '-') {
+      logger.info(
+        { currentVersion, upgrades, semverParsed },
+        'Found a hyphen range'
+      );
     } else {
       // We don't know how to support complex semver ranges, so don't upgrade
       result.message = `Complex semver ranges such as "${currentVersion}" are not yet supported so will be skipped`;
@@ -289,14 +294,36 @@ function determineUpgrades(npmDep, config) {
         return { ...upgrade, newVersion };
       } else if (lastSemver.minor === undefined) {
         // Example: 1
-        return { ...upgrade, ...{ newVersion: `${major}` } };
+        const newRange = [...semverParsed];
+        logger.debug('Found a standalone major');
+        newRange[newRange.length - 1].major = String(upgrade.newVersionMajor);
+        let newVersion;
+        if (secondLastSemver && secondLastSemver.operator === '||') {
+          newVersion = `${currentVersion} || ${upgrade.newVersionMajor}`;
+        } else {
+          newVersion = semverUtils.stringifyRange(newRange);
+          // Fixes a bug with semver-utils
+          newVersion = newVersion.replace(/\.0/g, '');
+        }
+        return { ...upgrade, newVersion };
       } else if (lastSemver.minor === 'x') {
         // Example: 1.x
-        return { ...upgrade, ...{ newVersion: `${major}.x` } };
+        const newRange = [...semverParsed];
+        logger.debug('Found a .x');
+        newRange[newRange.length - 1].major = String(upgrade.newVersionMajor);
+        let newVersion;
+        if (secondLastSemver && secondLastSemver.operator === '||') {
+          newVersion = `${currentVersion} || ${upgrade.newVersionMajor}.x`;
+        } else {
+          newVersion = semverUtils.stringifyRange(newRange);
+          // Fixes a bug with semver-utils
+          newVersion = newVersion.replace(/\.0/g, '');
+        }
+        return { ...upgrade, newVersion };
       } else if (lastSemver.patch === undefined) {
         // Example: 1.2
         return { ...upgrade, ...{ newVersion: `${major}.${minor}` } };
-      } else if (lastSemver.patch === 'x') {
+      } else if (lastSemver.patch === 'x' && semverParsed.length === 1) {
         // Example: 1.2.x
         return { ...upgrade, ...{ newVersion: `${major}.${minor}.x` } };
       }
diff --git a/test/workers/package/__snapshots__/versions.spec.js.snap b/test/workers/package/__snapshots__/versions.spec.js.snap
index a7b4c2c4115e1af2e13c70bf6879a2fbc5ef8905..dc234de8c66d0c7e0857826d384a28166f2cc6aa 100644
--- a/test/workers/package/__snapshots__/versions.spec.js.snap
+++ b/test/workers/package/__snapshots__/versions.spec.js.snap
@@ -347,6 +347,22 @@ Array [
 ]
 `;
 
+exports[`workers/package/versions .determineUpgrades(npmDep, config) supports complex major hyphen ranges 1`] = `
+Array [
+  Object {
+    "changeLogFromVersion": "2.7.0",
+    "changeLogToVersion": "3.8.1",
+    "isMajor": true,
+    "isRange": true,
+    "newVersion": "1.x - 3.x",
+    "newVersionMajor": 3,
+    "newVersionMinor": 8,
+    "type": "major",
+    "unpublishable": false,
+  },
+]
+`;
+
 exports[`workers/package/versions .determineUpgrades(npmDep, config) supports complex major ranges 1`] = `
 Array [
   Object {
@@ -824,3 +840,35 @@ Array [
   },
 ]
 `;
+
+exports[`workers/package/versions .determineUpgrades(npmDep, config) widens .x OR ranges 1`] = `
+Array [
+  Object {
+    "changeLogFromVersion": "2.7.0",
+    "changeLogToVersion": "3.8.1",
+    "isMajor": true,
+    "isRange": true,
+    "newVersion": "1.x || 2.x || 3.x",
+    "newVersionMajor": 3,
+    "newVersionMinor": 8,
+    "type": "major",
+    "unpublishable": false,
+  },
+]
+`;
+
+exports[`workers/package/versions .determineUpgrades(npmDep, config) widens stanndalone major OR ranges 1`] = `
+Array [
+  Object {
+    "changeLogFromVersion": "2.7.0",
+    "changeLogToVersion": "3.8.1",
+    "isMajor": true,
+    "isRange": true,
+    "newVersion": "1 || 2 || 3",
+    "newVersionMajor": 3,
+    "newVersionMinor": 8,
+    "type": "major",
+    "unpublishable": false,
+  },
+]
+`;
diff --git a/test/workers/package/versions.spec.js b/test/workers/package/versions.spec.js
index 872d5efde8de6afce3688fce1b41270ceb9dd3aa..6afb2e66e22efde958f8a05986f72c0c0e9bcd70 100644
--- a/test/workers/package/versions.spec.js
+++ b/test/workers/package/versions.spec.js
@@ -169,6 +169,24 @@ describe('workers/package/versions', () => {
       const res = versions.determineUpgrades(webpackJson, config);
       expect(res).toMatchSnapshot();
     });
+    it('supports complex major hyphen ranges', () => {
+      config.pinVersions = false;
+      config.currentVersion = '1.x - 2.x';
+      const res = versions.determineUpgrades(webpackJson, config);
+      expect(res).toMatchSnapshot();
+    });
+    it('widens .x OR ranges', () => {
+      config.pinVersions = false;
+      config.currentVersion = '1.x || 2.x';
+      const res = versions.determineUpgrades(webpackJson, config);
+      expect(res).toMatchSnapshot();
+    });
+    it('widens stanndalone major OR ranges', () => {
+      config.pinVersions = false;
+      config.currentVersion = '1 || 2';
+      const res = versions.determineUpgrades(webpackJson, config);
+      expect(res).toMatchSnapshot();
+    });
     it('supports complex tilde ranges', () => {
       config.pinVersions = false;
       config.currentVersion = '~1.2.0 || ~1.3.0';