diff --git a/lib/modules/versioning/semver-coerced/index.spec.ts b/lib/modules/versioning/semver-coerced/index.spec.ts
index 2e01daf209610c596c6444fc12852991eacc79f0..49dfd6b73114c619bb588f6cc7ae27ec72c107c9 100644
--- a/lib/modules/versioning/semver-coerced/index.spec.ts
+++ b/lib/modules/versioning/semver-coerced/index.spec.ts
@@ -49,16 +49,26 @@ describe('modules/versioning/semver-coerced/index', () => {
   });
 
   describe('.getPatch(input)', () => {
-    it('should return patch version number for strict semver', () => {
-      expect(semverCoerced.getPatch('1.0.2')).toBe(2);
-    });
-
-    it('should return patch version number for non-strict semver', () => {
-      expect(semverCoerced.getPatch('v3.1.2-foo')).toBe(2);
-    });
-
-    it('invalid version', () => {
-      expect(semverCoerced.getMajor('xxx')).toBeNull();
+    test.each`
+      version           | expected
+      ${'1.0.2'}        | ${2}
+      ${'v3.1.2-foo'}   | ${2}
+      ${'v1.3.5'}       | ${5}
+      ${'v2.1'}         | ${0}
+      ${'3.4'}          | ${0}
+      ${'v2'}           | ${0}
+      ${'2'}            | ${0}
+      ${'v1.0.4-alpha'} | ${4}
+      ${'1.0.3-Beta.1'} | ${3}
+      ${'1.0.0-rc2'}    | ${0}
+      ${'v1.0.8-rc2'}   | ${8}
+      ${'1.0-Beta.0'}   | ${0}
+      ${'two1.0'}       | ${0}
+      ${'ver1.2.3'}     | ${3}
+      ${'r3.0'}         | ${0}
+      ${'abc'}          | ${null}
+    `('getPatch("$version") === $expected', ({ version, expected }) => {
+      expect(semverCoerced.getPatch(version)).toBe(expected);
     });
   });
 
@@ -121,12 +131,25 @@ describe('modules/versioning/semver-coerced/index', () => {
   });
 
   describe('.isStable(input)', () => {
-    it('should return true for a stable version', () => {
-      expect(semverCoerced.isStable('1.0.0')).toBeTrue();
-    });
-
-    it('should return false for an prerelease version', () => {
-      expect(semverCoerced.isStable('v1.0-alpha')).toBeFalse();
+    test.each`
+      version           | expected
+      ${'1.0.0'}        | ${true}
+      ${'v1.3.5'}       | ${true}
+      ${'v2.1'}         | ${true}
+      ${'3.4'}          | ${true}
+      ${'v2'}           | ${true}
+      ${'2'}            | ${true}
+      ${'v1.0.0-alpha'} | ${false}
+      ${'1.0.0-Beta.1'} | ${false}
+      ${'1.0.0-rc2'}    | ${false}
+      ${'v1.0.0-rc2'}   | ${false}
+      ${'1.0-Beta.0'}   | ${false}
+      ${'v1.0-alpha'}   | ${false}
+      ${'two1.0'}       | ${false}
+      ${'ver1.2.3'}     | ${false}
+      ${'r3.0'}         | ${false}
+    `('isStable("$version") === $expected', ({ version, expected }) => {
+      expect(semverCoerced.isStable(version)).toBe(expected);
     });
   });
 
diff --git a/lib/modules/versioning/semver-coerced/index.ts b/lib/modules/versioning/semver-coerced/index.ts
index 4500e1faf31a066ec6a3ac13abdd39e74b2aab81..c17e9d248dce1391b84482cca85080251406aa48 100644
--- a/lib/modules/versioning/semver-coerced/index.ts
+++ b/lib/modules/versioning/semver-coerced/index.ts
@@ -9,7 +9,25 @@ export const displayName = 'Coerced Semantic Versioning';
 export const urls = ['https://semver.org/'];
 export const supportsRanges = false;
 
-const { is: isStable } = stable;
+function isStable(version: string): boolean {
+  // matching a version with the semver prefix
+  // v1.2.3, 1.2.3, v1.2, 1.2, v1, 1
+  const regx = regEx(
+    /^v?(?<major>\d+)(?<minor>\.\d+)?(?<patch>\.\d+)?(?<others>.+)?/
+  );
+  const m = regx.exec(version);
+
+  if (!m?.groups) {
+    return false;
+  }
+
+  const major = m.groups['major'];
+  const newMinor = m.groups['minor'] ?? '.0';
+  const newPatch = m.groups['patch'] ?? '.0';
+  const others = m.groups['others'] ?? '';
+  const fixed = major + newMinor + newPatch + others;
+  return stable.is(fixed);
+}
 
 function sortVersions(a: string, b: string): number {
   const aCoerced = semver.coerce(a);
@@ -29,7 +47,8 @@ function getMinor(a: string | SemVer): number | null {
 }
 
 function getPatch(a: string | SemVer): number | null {
-  return semver.patch(a);
+  const aCoerced = semver.coerce(a);
+  return aCoerced ? semver.patch(aCoerced) : null;
 }
 
 function matches(version: string, range: string): boolean {
@@ -77,9 +96,10 @@ function isLessThanRange(version: string, range: string): boolean {
 function isGreaterThan(version: string, other: string): boolean {
   const coercedVersion = semver.coerce(version);
   const coercedOther = semver.coerce(other);
-  return coercedVersion && coercedOther
-    ? semver.gt(coercedVersion, coercedOther)
-    : false;
+  if (!coercedVersion || !coercedOther) {
+    return false;
+  }
+  return semver.gt(coercedVersion, coercedOther);
 }
 
 const startsWithNumberRegex = regEx(`^\\d`);