diff --git a/lib/versioning/cargo/index.ts b/lib/versioning/cargo/index.ts
index ee33955a0954ca898a6d490b60538206fd865997..2a699e8de5d7c9899c354fb7c57573c291eeccf7 100644
--- a/lib/versioning/cargo/index.ts
+++ b/lib/versioning/cargo/index.ts
@@ -11,7 +11,7 @@ export const urls = [
 export const supportsRanges = true;
 export const supportedRangeStrategies = ['bump', 'extend', 'pin', 'replace'];
 
-const isVersion = (input: string): string | boolean => npm.isVersion(input);
+const isVersion = (input: string): boolean => npm.isVersion(input);
 
 function convertToCaret(item: string): string {
   // In Cargo, "1.2.3" doesn't mean exactly 1.2.3, it means >= 1.2.3 < 2.0.0
@@ -57,7 +57,7 @@ function npm2cargo(input: string): string {
 const isLessThanRange = (version: string, range: string): boolean =>
   npm.isLessThanRange(version, cargo2npm(range));
 
-export const isValid = (input: string): string | boolean =>
+export const isValid = (input: string): boolean =>
   npm.isValid(cargo2npm(input));
 
 const matches = (version: string, range: string): boolean =>
@@ -69,7 +69,7 @@ const getSatisfyingVersion = (versions: string[], range: string): string =>
 const minSatisfyingVersion = (versions: string[], range: string): string =>
   npm.minSatisfyingVersion(versions, cargo2npm(range));
 
-const isSingleVersion = (constraint: string): string | boolean =>
+const isSingleVersion = (constraint: string): boolean =>
   constraint.trim().startsWith('=') &&
   isVersion(constraint.trim().substring(1).trim());
 
diff --git a/lib/versioning/composer/index.spec.ts b/lib/versioning/composer/index.spec.ts
index b14bb08e01fe382c0d87ae6dc6f9b58fca5f7328..f83d44387027887a2884654074fbfcbf015603c8 100644
--- a/lib/versioning/composer/index.spec.ts
+++ b/lib/versioning/composer/index.spec.ts
@@ -169,4 +169,11 @@ describe('versioning/composer/index', () => {
   `('$versions -> sortVersions -> $expected ', ({ versions, expected }) => {
     expect(versions.sort(semver.sortVersions)).toEqual(expected);
   });
+
+  test.each`
+    version    | expected
+    ${'1.2.0'} | ${true}
+  `('isCompatible("$version") === $expected', ({ version, expected }) => {
+    expect(semver.isCompatible(version)).toBe(expected);
+  });
 });
diff --git a/lib/versioning/composer/index.ts b/lib/versioning/composer/index.ts
index 6d45845cd15559601d189bf63db800730a718e71..0b64fb5670cc8d416affad7e93b17ff5b600e2d7 100644
--- a/lib/versioning/composer/index.ts
+++ b/lib/versioning/composer/index.ts
@@ -102,17 +102,17 @@ const isGreaterThan = (a: string, b: string): boolean =>
 const isLessThanRange = (version: string, range: string): boolean =>
   npm.isLessThanRange(composer2npm(version), composer2npm(range));
 
-const isSingleVersion = (input: string): string | boolean =>
-  input && npm.isSingleVersion(composer2npm(input));
+const isSingleVersion = (input: string): boolean =>
+  !!input && npm.isSingleVersion(composer2npm(input));
 
 const isStable = (version: string): boolean =>
   version && npm.isStable(composer2npm(version));
 
-export const isValid = (input: string): string | boolean =>
-  input && npm.isValid(composer2npm(input));
+export const isValid = (input: string): boolean =>
+  !!input && npm.isValid(composer2npm(input));
 
-export const isVersion = (input: string): string | boolean =>
-  input && npm.isVersion(composer2npm(input));
+export const isVersion = (input: string): boolean =>
+  !!input && npm.isVersion(composer2npm(input));
 
 const matches = (version: string, range: string): boolean =>
   npm.matches(composer2npm(version), composer2npm(range));
@@ -234,12 +234,16 @@ function sortVersions(a: string, b: string): number {
   return npm.sortVersions(composer2npm(a), composer2npm(b));
 }
 
+function isCompatible(version: string): boolean {
+  return isVersion(version);
+}
+
 export const api: VersioningApi = {
   equals,
   getMajor,
   getMinor,
   getPatch,
-  isCompatible: isVersion,
+  isCompatible,
   isGreaterThan,
   isLessThanRange,
   isSingleVersion,
diff --git a/lib/versioning/docker/index.ts b/lib/versioning/docker/index.ts
index 909ede9a8ec083a00f4feed481f128f70f75506b..3e9ce2ad5e409fac50f1672a4488ce7ac1bbf05e 100644
--- a/lib/versioning/docker/index.ts
+++ b/lib/versioning/docker/index.ts
@@ -71,9 +71,9 @@ class DockerVersioningApi extends GenericVersioningApi {
     return parsed2.suffix.localeCompare(parsed1.suffix);
   }
 
-  override isCompatible(version: string, range: string): boolean {
+  override isCompatible(version: string, current: string): boolean {
     const parsed1 = this._parse(version);
-    const parsed2 = this._parse(range);
+    const parsed2 = this._parse(current);
     return (
       parsed1.suffix === parsed2.suffix &&
       parsed1.release.length === parsed2.release.length
diff --git a/lib/versioning/gradle/index.spec.ts b/lib/versioning/gradle/index.spec.ts
index 903db8b72c4ffa2ee971db35d030c6f8673d2ed5..3a8502120f905140a57c5af0ff8ba0e5465ca665 100644
--- a/lib/versioning/gradle/index.spec.ts
+++ b/lib/versioning/gradle/index.spec.ts
@@ -154,7 +154,7 @@ describe('versioning/gradle/index', () => {
 
   test.each`
     input                                   | expected
-    ${''}                                   | ${null}
+    ${''}                                   | ${false}
     ${'foobar'}                             | ${true}
     ${'final'}                              | ${true}
     ${'1'}                                  | ${true}
diff --git a/lib/versioning/gradle/index.ts b/lib/versioning/gradle/index.ts
index fa60dc22c520c17ff3574d4190cce103fae5e907..380e7722aa63182ca5d288ce508acc294219a51b 100644
--- a/lib/versioning/gradle/index.ts
+++ b/lib/versioning/gradle/index.ts
@@ -87,7 +87,7 @@ const unstable = new Set([
   'snapshot',
 ]);
 
-const isStable = (version: string): boolean | null => {
+const isStable = (version: string): boolean => {
   if (isVersion(version)) {
     const tokens = tokenize(version);
     for (const token of tokens) {
@@ -100,7 +100,7 @@ const isStable = (version: string): boolean | null => {
     }
     return true;
   }
-  return null;
+  return false;
 };
 
 const matches = (a: string, b: string): boolean => {
diff --git a/lib/versioning/hashicorp/index.ts b/lib/versioning/hashicorp/index.ts
index d71645853183827f6d3669198a469c3af326cbc5..eca16e90c11bc2080c0572b32327e6547399645d 100644
--- a/lib/versioning/hashicorp/index.ts
+++ b/lib/versioning/hashicorp/index.ts
@@ -18,8 +18,8 @@ function hashicorp2npm(input: string): string {
 const isLessThanRange = (version: string, range: string): boolean =>
   npm.isLessThanRange(hashicorp2npm(version), hashicorp2npm(range));
 
-export const isValid = (input: string): string | boolean =>
-  input && npm.isValid(hashicorp2npm(input));
+export const isValid = (input: string): boolean =>
+  !!input && npm.isValid(hashicorp2npm(input));
 
 const matches = (version: string, range: string): boolean =>
   npm.matches(hashicorp2npm(version), hashicorp2npm(range));
diff --git a/lib/versioning/ivy/index.spec.ts b/lib/versioning/ivy/index.spec.ts
index 9f19cdd817f997220c17387730d7f2cefbfadff6..76b873b04456fdc31fa6457c2328c7ce56ab6d64 100644
--- a/lib/versioning/ivy/index.spec.ts
+++ b/lib/versioning/ivy/index.spec.ts
@@ -179,4 +179,19 @@ describe('versioning/ivy/index', () => {
       expect(ivy.getSatisfyingVersion(versions, range)).toBe(expected);
     }
   );
+
+  test.each`
+    version    | expected
+    ${'1.2.0'} | ${true}
+  `('isCompatible("$version") === $expected', ({ version, expected }) => {
+    expect(ivy.isCompatible(version)).toBe(expected);
+  });
+
+  test.each`
+    version     | expected
+    ${'1.2.0'}  | ${true}
+    ${'^1.2.0'} | ${false}
+  `('isSingleVersion("$version") === $expected', ({ version, expected }) => {
+    expect(ivy.isSingleVersion(version)).toBe(expected);
+  });
 });
diff --git a/lib/versioning/ivy/index.ts b/lib/versioning/ivy/index.ts
index ed5c3000eb6ce9add8df15bb51441da7f98a9f93..ca6062f1389bd62562b008e4e8a6a4db19410e66 100644
--- a/lib/versioning/ivy/index.ts
+++ b/lib/versioning/ivy/index.ts
@@ -31,14 +31,14 @@ const {
   sortVersions,
 } = maven;
 
-function isValid(str: string): string | boolean {
+function isValid(str: string): boolean {
   if (!str) {
     return false;
   }
   return maven.isVersion(str) || !!parseDynamicRevision(str);
 }
 
-function isVersion(str: string): string | boolean {
+function isVersion(str: string): boolean {
   if (!str || LATEST_REGEX.test(str)) {
     return false;
   }
@@ -101,14 +101,22 @@ function getNewValue({
   return autoExtendMavenRange(currentValue, newVersion);
 }
 
+function isCompatible(version: string): boolean {
+  return isVersion(version);
+}
+
+function isSingleVersion(version: string): boolean {
+  return isVersion(version);
+}
+
 export const api: VersioningApi = {
   equals,
   getMajor,
   getMinor,
   getPatch,
-  isCompatible: isVersion,
+  isCompatible,
   isGreaterThan,
-  isSingleVersion: isVersion,
+  isSingleVersion,
   isStable,
   isValid,
   isVersion,
diff --git a/lib/versioning/loose/generic.ts b/lib/versioning/loose/generic.ts
index cf8d49bbed7fd7246d2630760a224296f9bb2a4c..0691111d2d5fc6c234895dc84cc94c6f41122837 100644
--- a/lib/versioning/loose/generic.ts
+++ b/lib/versioning/loose/generic.ts
@@ -78,7 +78,7 @@ export abstract class GenericVersioningApi<
     return this._parse(version) !== null;
   }
 
-  isCompatible(version: string, _range: string): boolean {
+  isCompatible(version: string, _current: string): boolean {
     return this.isValid(version);
   }
 
@@ -87,11 +87,11 @@ export abstract class GenericVersioningApi<
     return parsed && !parsed.prerelease;
   }
 
-  isSingleVersion(version: string): string | boolean {
+  isSingleVersion(version: string): boolean {
     return this.isValid(version);
   }
 
-  isVersion(version: string): string | boolean {
+  isVersion(version: string): boolean {
     return this.isValid(version);
   }
 
diff --git a/lib/versioning/loose/index.spec.ts b/lib/versioning/loose/index.spec.ts
index 1d27d33dee333224c07fa28b493ae6d653fd2aa3..56687e4af90129081fd5c75bfe5ad74012e14d88 100644
--- a/lib/versioning/loose/index.spec.ts
+++ b/lib/versioning/loose/index.spec.ts
@@ -47,4 +47,19 @@ describe('versioning/loose/index', () => {
   `('isGreaterThan("$a", "$b") === $expected', ({ a, b, expected }) => {
     expect(loose.isGreaterThan(a, b)).toBe(expected);
   });
+
+  test.each`
+    version    | expected
+    ${'1.2.0'} | ${true}
+  `('isCompatible("$version") === $expected', ({ version, expected }) => {
+    expect(loose.isCompatible(version)).toBe(expected);
+  });
+
+  test.each`
+    version     | expected
+    ${'1.2.0'}  | ${true}
+    ${'^1.2.0'} | ${false}
+  `('isSingleVersion("$version") === $expected', ({ version, expected }) => {
+    expect(loose.isSingleVersion(version)).toBe(expected);
+  });
 });
diff --git a/lib/versioning/poetry/index.ts b/lib/versioning/poetry/index.ts
index e2914024d600c4fad31569764e6d64c25079782a..dbeb05779dfe95de5f50de9be0938a573d4372a5 100644
--- a/lib/versioning/poetry/index.ts
+++ b/lib/versioning/poetry/index.ts
@@ -47,7 +47,7 @@ function isLessThanRange(version: string, range: string): boolean {
   );
 }
 
-export function isValid(input: string): string | boolean {
+export function isValid(input: string): boolean {
   return npm.isValid(poetry2npm(input));
 }
 
@@ -79,7 +79,7 @@ function minSatisfyingVersion(versions: string[], range: string): string {
   );
 }
 
-function isSingleVersion(constraint: string): string | boolean {
+function isSingleVersion(constraint: string): boolean {
   return (
     (constraint.trim().startsWith('=') &&
       isVersion(constraint.trim().substring(1).trim())) ||
diff --git a/lib/versioning/regex/index.ts b/lib/versioning/regex/index.ts
index 7429dd220e1a1d47e5ac4459b2badb231ba2f62e..417dd48633603fa624ecd3a84178b85018c1a4ec 100644
--- a/lib/versioning/regex/index.ts
+++ b/lib/versioning/regex/index.ts
@@ -89,9 +89,9 @@ export class RegExpVersioningApi extends GenericVersioningApi<RegExpVersion> {
     };
   }
 
-  override isCompatible(version: string, range: string): boolean {
+  override isCompatible(version: string, current: string): boolean {
     return (
-      this._parse(version).compatibility === this._parse(range).compatibility
+      this._parse(version).compatibility === this._parse(current).compatibility
     );
   }
 
diff --git a/lib/versioning/rez/index.spec.ts b/lib/versioning/rez/index.spec.ts
index f7860ddc313aca41ecf16e7cd699e9319dfab52f..69a6fd3bf0776a0e9082b04c7333d5b656d573d4 100644
--- a/lib/versioning/rez/index.spec.ts
+++ b/lib/versioning/rez/index.spec.ts
@@ -439,4 +439,11 @@ describe('versioning/rez/index', () => {
       expect(res).toBe(expected);
     }
   );
+
+  test.each`
+    version    | expected
+    ${'1.2.0'} | ${true}
+  `('isCompatible("$version") === $expected', ({ version, expected }) => {
+    expect(versioning.isCompatible(version)).toBe(expected);
+  });
 });
diff --git a/lib/versioning/rez/index.ts b/lib/versioning/rez/index.ts
index f027ed5254212dc15c6ab03d1d7a6d507a58a1d5..33712bb0b52fdd2561a731b693f9075a022bd40e 100644
--- a/lib/versioning/rez/index.ts
+++ b/lib/versioning/rez/index.ts
@@ -72,7 +72,7 @@ function isLessThanRange(version: string, range: string): boolean {
   );
 }
 
-export function isValid(input: string): string | boolean {
+export function isValid(input: string): boolean {
   return npm.isValid(rez2npm(input));
 }
 
@@ -80,7 +80,7 @@ function isStable(version: string): boolean {
   return npm.isStable(padZeroes(version));
 }
 
-function isVersion(input: string): string | boolean {
+function isVersion(input: string): boolean {
   return npm.isVersion(padZeroes(rez2npm(input)));
 }
 
@@ -99,7 +99,7 @@ function minSatisfyingVersion(versions: string[], range: string): string {
   return npm.minSatisfyingVersion(versions, rez2npm(range));
 }
 
-function isSingleVersion(constraint: string): string | boolean {
+function isSingleVersion(constraint: string): boolean {
   return (
     (constraint.trim().startsWith('==') &&
       isVersion(constraint.trim().substring(2).trim())) ||
@@ -192,6 +192,10 @@ function getNewValue({
   return null;
 }
 
+function isCompatible(version: string): boolean {
+  return isVersion(version);
+}
+
 export const api: VersioningApi = {
   equals,
   getMajor,
@@ -199,7 +203,7 @@ export const api: VersioningApi = {
   getPatch,
   getNewValue,
   getSatisfyingVersion,
-  isCompatible: isVersion,
+  isCompatible,
   isGreaterThan,
   isLessThanRange,
   isSingleVersion,
diff --git a/lib/versioning/ruby/range.ts b/lib/versioning/ruby/range.ts
index 8230d1d7fed1c66680c2aeb71eb3460822636f2d..555e34a0ee161d7661ea26b1b315a76413f3bed8 100644
--- a/lib/versioning/ruby/range.ts
+++ b/lib/versioning/ruby/range.ts
@@ -32,11 +32,11 @@ const parse = (range: string): Range => {
 
 type GemRequirement = [string, Version];
 
-const ltr = (version: string, range: string): boolean | null => {
+const ltr = (version: string, range: string): boolean => {
   const gemVersion = create(version);
   if (!gemVersion) {
     logger.warn(`Invalid ruby version '${version}'`);
-    return null;
+    return false;
   }
   const requirements: GemRequirement[] = range.split(',').map(_parse);
 
@@ -58,7 +58,7 @@ const ltr = (version: string, range: string): boolean | null => {
       // istanbul ignore next
       default:
         logger.warn(`Unsupported operator '${operator}'`);
-        return null;
+        return false;
     }
   });
 
diff --git a/lib/versioning/semver-coerced/index.ts b/lib/versioning/semver-coerced/index.ts
index 941f276e7a21d06c648a500da62509d50ed8c193..b3a9ba35e4d0f3d58774bc439bbf20a9933dbd35 100644
--- a/lib/versioning/semver-coerced/index.ts
+++ b/lib/versioning/semver-coerced/index.ts
@@ -43,8 +43,8 @@ function equals(a: string, b: string): boolean {
   return aCoerced && bCoerced ? semver.eq(aCoerced, bCoerced) : false;
 }
 
-function isValid(version: string): string | boolean | null {
-  return semver.valid(semver.coerce(version));
+function isValid(version: string): boolean {
+  return !!semver.valid(semver.coerce(version));
 }
 
 function getSatisfyingVersion(
@@ -84,19 +84,18 @@ function isGreaterThan(version: string, other: string): boolean {
 
 const startsWithNumberRegex = regEx(`^\\d`);
 
-function isSingleVersion(version: string): string | boolean | null {
+function isSingleVersion(version: string): boolean {
   // Since coercion accepts ranges as well as versions, we have to manually
   // check that the version string starts with either 'v' or a digit.
   if (!version.startsWith('v') && !startsWithNumberRegex.exec(version)) {
-    return null;
+    return false;
   }
 
-  return semver.valid(semver.coerce(version));
+  return !!semver.valid(semver.coerce(version));
 }
 
 // If this is left as an alias, inputs like "17.04.0" throw errors
-export const isVersion = (input: string): string | boolean | null =>
-  isValid(input);
+export const isVersion = (input: string): boolean => isValid(input);
 
 export { isVersion as isValid, getSatisfyingVersion };
 
@@ -104,12 +103,16 @@ function getNewValue({ newVersion }: NewValueConfig): string {
   return newVersion;
 }
 
+function isCompatible(version: string): boolean {
+  return isVersion(version);
+}
+
 export const api: VersioningApi = {
   equals,
   getMajor,
   getMinor,
   getPatch,
-  isCompatible: isVersion,
+  isCompatible,
   isGreaterThan,
   isLessThanRange,
   isSingleVersion,
diff --git a/lib/versioning/semver/index.spec.ts b/lib/versioning/semver/index.spec.ts
index 5a3c3ff65fd18ff744f031d841d3264a108b5907..164c3480ef3feeb221a036b3cee51b35aa7395ed 100644
--- a/lib/versioning/semver/index.spec.ts
+++ b/lib/versioning/semver/index.spec.ts
@@ -43,4 +43,11 @@ describe('versioning/semver/index', () => {
       expect(res).toEqual(expected);
     }
   );
+
+  test.each`
+    version    | expected
+    ${'1.2.0'} | ${true}
+  `('isCompatible("$version") === $expected', ({ version, expected }) => {
+    expect(semver.isCompatible(version)).toBe(expected);
+  });
 });
diff --git a/lib/versioning/semver/index.ts b/lib/versioning/semver/index.ts
index dc9f8485b3a6a8812fd2da4833c87aa153c84948..5bb38c9954f0aef1e596327cbcb0f27c35071da0 100644
--- a/lib/versioning/semver/index.ts
+++ b/lib/versioning/semver/index.ts
@@ -24,8 +24,7 @@ const {
 } = semver;
 
 // If this is left as an alias, inputs like "17.04.0" throw errors
-export const isVersion = (input: string): string | boolean | null =>
-  valid(input);
+export const isVersion = (input: string): boolean => !!valid(input);
 
 export { isVersion as isValid, getSatisfyingVersion };
 
@@ -33,17 +32,29 @@ function getNewValue({ newVersion }: NewValueConfig): string {
   return newVersion;
 }
 
+function isCompatible(version: string): boolean {
+  return isVersion(version);
+}
+
+function isSingleVersion(version: string): boolean {
+  return isVersion(version);
+}
+
+function isValid(input: string): boolean {
+  return isVersion(input);
+}
+
 export const api: VersioningApi = {
   equals,
   getMajor,
   getMinor,
   getPatch,
-  isCompatible: isVersion,
+  isCompatible,
   isGreaterThan,
   isLessThanRange,
-  isSingleVersion: isVersion,
+  isSingleVersion,
   isStable,
-  isValid: isVersion,
+  isValid,
   isVersion,
   matches,
   getSatisfyingVersion,
diff --git a/lib/versioning/types.ts b/lib/versioning/types.ts
index cb2091c9f72444e40734ea105382529e00a3ce96..928676c6d40faa9181e7f050cfb2b63a242d3786 100644
--- a/lib/versioning/types.ts
+++ b/lib/versioning/types.ts
@@ -9,11 +9,11 @@ export interface NewValueConfig {
 }
 export interface VersioningApi {
   // validation
-  isCompatible(version: string, range?: string): string | boolean | null;
-  isSingleVersion(version: string): string | boolean | null;
+  isCompatible(version: string, current?: string): boolean;
+  isSingleVersion(version: string): boolean;
   isStable(version: string): boolean;
-  isValid(version: string): string | boolean | null;
-  isVersion(version: string): string | boolean | null;
+  isValid(input: string): boolean;
+  isVersion(input: string): boolean;
 
   // digestion of version
   getMajor(version: string | SemVer): null | number;
diff --git a/lib/versioning/ubuntu/index.ts b/lib/versioning/ubuntu/index.ts
index 07e470eedffd8fbcaa987144dc19a8be420cd5b1..0bce4216a5c52f6fb66c318e9f09187e33289cff 100644
--- a/lib/versioning/ubuntu/index.ts
+++ b/lib/versioning/ubuntu/index.ts
@@ -11,26 +11,23 @@ const temporarilyUnstable = ['22.04'];
 
 // validation
 
-function isValid(input: string): string | boolean | null {
+function isValid(input: string): boolean {
   return (
     typeof input === 'string' &&
     regEx(/^(0[4-5]|[6-9]|[1-9][0-9])\.[0-9][0-9](\.[0-9]{1,2})?$/).test(input)
   );
 }
 
-function isVersion(input: string): string | boolean | null {
+function isVersion(input: string): boolean {
   return isValid(input);
 }
 
-function isCompatible(
-  version: string,
-  _range?: string
-): string | boolean | null {
+function isCompatible(version: string, _current?: string): boolean {
   return isValid(version);
 }
 
-function isSingleVersion(version: string): string | boolean | null {
-  return isValid(version) ? true : null;
+function isSingleVersion(version: string): boolean {
+  return isValid(version);
 }
 
 function isStable(version: string): boolean {
@@ -72,7 +69,7 @@ function getPatch(version: string): null | number {
 // comparison
 
 function equals(version: string, other: string): boolean {
-  return !!isVersion(version) && !!isVersion(other) && version === other;
+  return isVersion(version) && isVersion(other) && version === other;
 }
 
 function isGreaterThan(version: string, other: string): boolean {