diff --git a/lib/versioning/ruby/index.spec.ts b/lib/versioning/ruby/index.spec.ts
index 3b18a1554e98fea160d863529c816f8003d14dc2..5cbe03cc4378718d7980f907fbc35542384c486a 100644
--- a/lib/versioning/ruby/index.spec.ts
+++ b/lib/versioning/ruby/index.spec.ts
@@ -278,15 +278,6 @@ describe('semverRuby', () => {
         false
       );
     });
-
-    it('returns null for garbage version input', () => {
-      expect(semverRuby.isLessThanRange('asdf', '> 1.2.2, ~> 2.0.0')).toBe(
-        null
-      );
-      expect(
-        semverRuby.isLessThanRange(null as string, '> 1.2.2, ~> 2.0.0')
-      ).toBe(null);
-    });
   });
 
   describe('.isValid', () => {
diff --git a/lib/versioning/ruby/index.ts b/lib/versioning/ruby/index.ts
index 500270fd4ea8146c14999ce7f27bd609d3581f9f..334e27b46d0a6cb89e5e5036b7aeaafda84aa757 100644
--- a/lib/versioning/ruby/index.ts
+++ b/lib/versioning/ruby/index.ts
@@ -5,7 +5,7 @@ import {
   satisfies,
   maxSatisfying,
   minSatisfying,
-} from '@renovatebot/ruby-semver';
+} from '@snyk/ruby-semver';
 import { VersioningApi, NewValueConfig } from '../common';
 import { logger } from '../../logger';
 import { parse as parseVersion } from './version';
diff --git a/lib/versioning/ruby/range.ts b/lib/versioning/ruby/range.ts
index fd0f46e26b78054b3bceb8d7fd9087e1b14c4729..be31b163aa2b9bd93e539fff10c84a485f649337 100644
--- a/lib/versioning/ruby/range.ts
+++ b/lib/versioning/ruby/range.ts
@@ -1,5 +1,5 @@
-import { create, Version } from '@renovatebot/ruby-semver/dist/ruby/version';
-import { parse as _parse } from '@renovatebot/ruby-semver/dist/ruby/requirement';
+import { create } from '@snyk/ruby-semver/lib/ruby/gem-version';
+import { parse as _parse } from '@snyk/ruby-semver/lib/ruby/gem-requirement';
 import { logger } from '../../logger';
 import { EQUAL, NOT_EQUAL, GT, LT, GTE, LTE, PGTE } from './operator';
 
@@ -27,14 +27,15 @@ const parse = (range: string): Range => {
   };
 };
 
-type GemRequirement = [string, Version];
+interface GemVersion {
+  release(): GemVersion;
+  compare(ver: GemVersion): number;
+  bump(): GemVersion;
+}
+type GemRequirement = [string, GemVersion];
 
-const ltr = (version: string, range: string): boolean | null => {
-  const gemVersion = create(version);
-  if (!gemVersion) {
-    logger.warn(`Invalid ruby version '${version}'`);
-    return null;
-  }
+const ltr = (version: string, range: string): boolean => {
+  const gemVersion: GemVersion = create(version);
   const requirements: GemRequirement[] = range.split(',').map(_parse);
 
   const results = requirements.map(([operator, ver]) => {
diff --git a/lib/versioning/ruby/strategies/bump.ts b/lib/versioning/ruby/strategies/bump.ts
index a66d6ffe36b05018d56b460ff794b5771b66ef9e..acbac49726cdb1db765caa4e0764c73aa18faf2d 100644
--- a/lib/versioning/ruby/strategies/bump.ts
+++ b/lib/versioning/ruby/strategies/bump.ts
@@ -1,4 +1,4 @@
-import { gte, lte } from '@renovatebot/ruby-semver';
+import { gte, lte } from '@snyk/ruby-semver';
 import { logger } from '../../../logger';
 import { EQUAL, NOT_EQUAL, GT, LT, GTE, LTE, PGTE } from '../operator';
 import { floor, increment, decrement } from '../version';
diff --git a/lib/versioning/ruby/strategies/replace.ts b/lib/versioning/ruby/strategies/replace.ts
index 4ff52e7562ddaa1e85521eedef3be03582fdadc7..632e32ba3b550ba8f5a98f7a81f7c2f158778e28 100644
--- a/lib/versioning/ruby/strategies/replace.ts
+++ b/lib/versioning/ruby/strategies/replace.ts
@@ -1,4 +1,4 @@
-import { satisfies } from '@renovatebot/ruby-semver';
+import { satisfies } from '@snyk/ruby-semver';
 import bump from './bump';
 import { logger } from '../../../logger';
 
diff --git a/lib/versioning/ruby/version.ts b/lib/versioning/ruby/version.ts
index 7059b5b922fa59e3aa1646d7b1e5a26fe259d53d..a6914561f59f78bd6006736122020e76b616d848 100644
--- a/lib/versioning/ruby/version.ts
+++ b/lib/versioning/ruby/version.ts
@@ -1,24 +1,12 @@
 import last from 'lodash/last';
-import {
-  create,
-  SegmentElement,
-} from '@renovatebot/ruby-semver/dist/ruby/version';
-import { eq, major, minor, patch, prerelease } from '@renovatebot/ruby-semver';
+import { create } from '@snyk/ruby-semver/lib/ruby/gem-version';
+import { diff, major, minor, patch, prerelease } from '@snyk/ruby-semver';
 
 interface RubyVersion {
   major: number;
   minor: number;
   patch: number;
-  prerelease: string[] | null;
-}
-
-function releaseSegments(version: string): SegmentElement[] {
-  const v = create(version);
-  if (v) {
-    return v.release().getSegments();
-  }
-  /* istanbul ignore next */
-  return [];
+  prerelease: string[];
 }
 
 const parse = (version: string): RubyVersion => ({
@@ -31,14 +19,13 @@ const parse = (version: string): RubyVersion => ({
 const adapt = (left: string, right: string): string =>
   left.split('.').slice(0, right.split('.').length).join('.');
 
-const floor = (version: string): string => {
-  return [...releaseSegments(version).slice(0, -1), 0].join('.');
-};
+const floor = (version: string): string =>
+  [...create(version).release().getSegments().slice(0, -1), 0].join('.');
 
 // istanbul ignore next
 const incrementLastSegment = (version: string): string => {
-  const segments = releaseSegments(version);
-  const nextLast = parseInt(last(segments) as string, 10) + 1;
+  const segments = create(version).release().getSegments();
+  const nextLast = parseInt(last(segments), 10) + 1;
 
   return [...segments.slice(0, -1), nextLast].join('.');
 };
@@ -61,29 +48,24 @@ const incrementPatch = (ptch: number, pre: string[]): number =>
 
 // istanbul ignore next
 const increment = (from: string, to: string): string => {
-  const parsed = parse(from);
-  const { major: maj, prerelease: pre } = parsed;
-  let { minor: min, patch: ptch } = parsed;
-  min = min || 0;
-  ptch = ptch || 0;
+  const { major: maj, minor: min, patch: ptch, prerelease: pre } = parse(from);
 
   let nextVersion: string;
-  const adapted = adapt(to, from);
-  if (eq(from, adapted)) {
-    return incrementLastSegment(from);
-  }
-
-  const isStable = (x: string): boolean => /^[0-9.-/]+$/.test(x);
-  if (major(from) !== major(adapted)) {
-    nextVersion = [incrementMajor(maj, min, ptch, pre || []), 0, 0].join('.');
-  } else if (minor(from) !== minor(adapted)) {
-    nextVersion = [maj, incrementMinor(min, ptch, pre || []), 0].join('.');
-  } else if (patch(from) !== patch(adapted)) {
-    nextVersion = [maj, min, incrementPatch(ptch, pre || [])].join('.');
-  } else if (isStable(from) && isStable(adapted)) {
-    nextVersion = [maj, min, incrementPatch(ptch, pre || [])].join('.');
-  } else {
-    nextVersion = [maj, min, ptch].join('.');
+  switch (diff(from, adapt(to, from))) {
+    case 'major':
+      nextVersion = [incrementMajor(maj, min, ptch, pre || []), 0, 0].join('.');
+      break;
+    case 'minor':
+      nextVersion = [maj, incrementMinor(min, ptch, pre || []), 0].join('.');
+      break;
+    case 'patch':
+      nextVersion = [maj, min, incrementPatch(ptch, pre || [])].join('.');
+      break;
+    case 'prerelease':
+      nextVersion = [maj, min, ptch].join('.');
+      break;
+    default:
+      return incrementLastSegment(from);
   }
 
   return increment(nextVersion, to);
@@ -91,31 +73,20 @@ const increment = (from: string, to: string): string => {
 
 // istanbul ignore next
 const decrement = (version: string): string => {
-  const segments = releaseSegments(version);
+  const segments = create(version).release().getSegments();
   const nextSegments = segments
     .reverse()
-    .reduce(
-      (
-        accumulator: number[],
-        segment: SegmentElement,
-        index: number
-      ): number[] => {
-        if (index === 0) {
-          return [(segment as number) - 1];
-        }
-
-        if (accumulator[index - 1] === -1) {
-          return [
-            ...accumulator.slice(0, index - 1),
-            0,
-            (segment as number) - 1,
-          ];
-        }
-
-        return [...accumulator, segment as number];
-      },
-      []
-    );
+    .reduce((accumulator: number[], segment: number, index: number) => {
+      if (index === 0) {
+        return [segment - 1];
+      }
+
+      if (accumulator[index - 1] === -1) {
+        return [...accumulator.slice(0, index - 1), 0, segment - 1];
+      }
+
+      return [...accumulator, segment];
+    }, []);
 
   return nextSegments.reverse().join('.');
 };
diff --git a/package.json b/package.json
index 541a0ddd6cc6eac8c26443a7c3b4e1b182679f0e..c3c5935396200aac6ff952f9d79aa0bf6047742d 100644
--- a/package.json
+++ b/package.json
@@ -110,8 +110,8 @@
   },
   "dependencies": {
     "@renovate/pep440": "0.4.1",
-    "@renovatebot/ruby-semver": "0.1.4",
     "@sindresorhus/is": "2.1.0",
+    "@snyk/ruby-semver": "2.1.0",
     "@yarnpkg/lockfile": "1.1.0",
     "aws-sdk": "2.656.0",
     "azure-devops-node-api": "10.1.1",
diff --git a/yarn.lock b/yarn.lock
index bc80e79fe538d4d23c1dd64749b86b3643441dc5..44bbf05dc89b1596645805a9956024ca03e77073 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1163,11 +1163,6 @@
   dependencies:
     xregexp "4.2.0"
 
-"@renovatebot/ruby-semver@0.1.4":
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/@renovatebot/ruby-semver/-/ruby-semver-0.1.4.tgz#adc36fa426f249cffbe005aaa0c86b9e907f2286"
-  integrity sha512-lM1snOgcu2mJeccOmaFMj2+yCPEdifqfW1alObgNrOgArAGJB1vSH4YgfG41YuOulZX4BwSK/c+2W3XifTYh8g==
-
 "@semantic-release/commit-analyzer@^8.0.0":
   version "8.0.1"
   resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz#5d2a37cd5a3312da0e3ac05b1ca348bf60b90bca"
@@ -1301,6 +1296,13 @@
   resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5"
   integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==
 
+"@snyk/ruby-semver@2.1.0":
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/@snyk/ruby-semver/-/ruby-semver-2.1.0.tgz#d76cc02fc20860c224da2646fe9cc1bb0b0d1d15"
+  integrity sha512-u8ez8kWyqge+N+FxRDx/uPBmcHzY7BMfODvzEVeoTOeoD0CHPymEaVlkEKA8ZHtxzXjUzPIl2I8f2siZEzLjYg==
+  dependencies:
+    lodash "^4.17.14"
+
 "@szmarczak/http-timer@^1.1.2":
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"