diff --git a/lib/versioning/composer/index.spec.ts b/lib/versioning/composer/index.spec.ts
index 1e7aa29ff435e44cfff4a5edf2a4bb7beead4edb..610613f148813ce0157a2755f53f53c646e8e18d 100644
--- a/lib/versioning/composer/index.spec.ts
+++ b/lib/versioning/composer/index.spec.ts
@@ -306,12 +306,52 @@ describe('semver.getNewValue()', () => {
     ).toEqual('~3.0');
     expect(
       semver.getNewValue({
-        currentValue: '~1.2 || ~2.0',
+        currentValue: '~1.2 || ~2.0 || ~3.0',
         rangeStrategy: 'widen',
         currentVersion: '2.0.0',
-        newVersion: '3.1.0',
+        newVersion: '5.1.0',
+      })
+    ).toEqual('~1.2 || ~2.0 || ~3.0 || ~5.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.2',
+        rangeStrategy: 'widen',
+        currentVersion: '1.2.0',
+        newVersion: '2.0.0',
+      })
+    ).toEqual('^1.2 || ^2.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1.2',
+        rangeStrategy: 'widen',
+        currentVersion: '1.2.0',
+        newVersion: '2.4.0',
+      })
+    ).toEqual('~1.2 || ~2.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1.2',
+        rangeStrategy: 'widen',
+        currentVersion: '1.2.0',
+        newVersion: '1.9.0',
+      })
+    ).toEqual('~1.2');
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.2',
+        rangeStrategy: 'widen',
+        currentVersion: '1.2.0',
+        newVersion: '1.9.0',
+      })
+    ).toEqual('^1.2');
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0 || ^2.0',
+        rangeStrategy: 'widen',
+        currentVersion: '2.0.0',
+        newVersion: '2.1.0',
       })
-    ).toEqual('~1.2 || ~2.0 || ~3.0');
+    ).toEqual('^1.0 || ^2.0');
   });
   it('returns newVersion if unsupported', () => {
     expect(
diff --git a/lib/versioning/composer/index.ts b/lib/versioning/composer/index.ts
index a6f497ea32d6b0edaade07962d68a14a06495c1c..e9f22f9a3a71036796580ed15da6f6e4f2d8cbc0 100644
--- a/lib/versioning/composer/index.ts
+++ b/lib/versioning/composer/index.ts
@@ -172,20 +172,29 @@ function getNewValue({
       newVersion: padZeroes(normalizeVersion(newVersion)),
     });
   }
-  if (currentValue.includes(' || ')) {
-    const lastValue = currentValue.split('||').pop().trim();
-    const replacementValue = getNewValue({
-      currentValue: lastValue,
-      rangeStrategy,
-      currentVersion,
-      newVersion,
-    });
-    if (rangeStrategy === 'replace') {
-      newValue = replacementValue;
-    } else if (rangeStrategy === 'widen') {
-      newValue = currentValue + ' || ' + replacementValue;
+
+  if (rangeStrategy === 'widen' && matches(newVersion, currentValue)) {
+    newValue = currentValue;
+  } else {
+    const hasOr = currentValue.includes(' || ');
+    if (hasOr || rangeStrategy === 'widen') {
+      const lastValue = hasOr
+        ? currentValue.split('||').pop().trim()
+        : currentValue;
+      const replacementValue = getNewValue({
+        currentValue: lastValue,
+        rangeStrategy: 'replace',
+        currentVersion,
+        newVersion,
+      });
+      if (rangeStrategy === 'replace') {
+        newValue = replacementValue;
+      } else {
+        newValue = currentValue + ' || ' + replacementValue;
+      }
     }
   }
+
   if (!newValue) {
     logger.warn(
       { currentValue, rangeStrategy, currentVersion, newVersion },