diff --git a/lib/versioning/maven/compare.ts b/lib/versioning/maven/compare.ts
index af22f91bdabf94f7cce0c7d012558985025ad925..767661d93b1ca104277387847fafdc97098655e5 100644
--- a/lib/versioning/maven/compare.ts
+++ b/lib/versioning/maven/compare.ts
@@ -160,22 +160,32 @@ function commonOrder(token: Token): number {
   return 3;
 }
 
-function qualifierOrder(token: Token): number {
+export enum QualifierTypes {
+  Alpha = 1,
+  Beta,
+  Milestone,
+  RC,
+  Snapshot,
+  Release,
+  SP,
+}
+
+export function qualifierType(token: Token): number {
   const val = token.val;
   if (val === 'alpha' || (token.isTransition && val === 'a')) {
-    return 1;
+    return QualifierTypes.Alpha;
   }
   if (val === 'beta' || (token.isTransition && val === 'b')) {
-    return 2;
+    return QualifierTypes.Beta;
   }
   if (val === 'milestone' || (token.isTransition && val === 'm')) {
-    return 3;
+    return QualifierTypes.Milestone;
   }
   if (val === 'rc' || val === 'cr') {
-    return 4;
+    return QualifierTypes.RC;
   }
   if (val === 'snapshot') {
-    return 5;
+    return QualifierTypes.Snapshot;
   }
   if (
     val === '' ||
@@ -184,65 +194,45 @@ function qualifierOrder(token: Token): number {
     val === 'release' ||
     val === 'latest'
   ) {
-    return 6;
+    return QualifierTypes.Release;
   }
   if (val === 'sp') {
-    return 7;
+    return QualifierTypes.SP;
   }
   return null;
 }
 
 function qualifierCmp(left: Token, right: Token): number {
-  const leftOrder = qualifierOrder(left);
-  const rightOrder = qualifierOrder(right);
+  const leftOrder = qualifierType(left);
+  const rightOrder = qualifierType(right);
   if (leftOrder && rightOrder) {
-    if (leftOrder === rightOrder) {
-      return 0;
-    }
-    if (leftOrder < rightOrder) {
-      return -1;
-    }
-    return 1;
-  }
-  if (left.val === right.val) {
+    if (leftOrder < rightOrder) return -1;
+    if (leftOrder > rightOrder) return 1;
     return 0;
   }
-  if (left.val < right.val) {
-    return -1;
-  }
-  // istanbul ignore next
-  return 1;
+
+  if (leftOrder && leftOrder < QualifierTypes.Release) return -1;
+  if (rightOrder && rightOrder < QualifierTypes.Release) return 1;
+
+  if (left.val < right.val) return -1;
+  if (left.val > right.val) return 1;
+  return 0;
 }
 
 function tokenCmp(left: Token, right: Token): number {
-  if (left.prefix === right.prefix) {
-    if (left.type === TYPE_NUMBER && right.type === TYPE_NUMBER) {
-      if (left.val === right.val) {
-        return 0;
-      }
-      if (left.val < right.val) {
-        return -1;
-      }
-      return 1;
-    }
-    if (left.type === TYPE_NUMBER) {
-      return 1;
-    }
-    if (right.type === TYPE_NUMBER) {
-      return -1;
-    }
-    return qualifierCmp(left, right);
-  }
   const leftOrder = commonOrder(left);
   const rightOrder = commonOrder(right);
-  // istanbul ignore if
-  if (leftOrder === rightOrder) {
+
+  if (leftOrder < rightOrder) return -1;
+  if (leftOrder > rightOrder) return 1;
+
+  if (left.type === TYPE_NUMBER && right.type === TYPE_NUMBER) {
+    if (left.val < right.val) return -1;
+    if (left.val > right.val) return 1;
     return 0;
   }
-  if (leftOrder < rightOrder) {
-    return -1;
-  }
-  return 1;
+
+  return qualifierCmp(left, right);
 }
 
 function compare(left: string, right: string): number {
diff --git a/lib/versioning/maven/index.ts b/lib/versioning/maven/index.ts
index 4cf72ac3ce8a7d0b67cbcf108a607137b597ccde..9e4b8a88b1f0312803472efab06f0b66599061a3 100644
--- a/lib/versioning/maven/index.ts
+++ b/lib/versioning/maven/index.ts
@@ -9,6 +9,8 @@ import {
   autoExtendMavenRange,
   parseRange,
   EXCLUDING_POINT,
+  qualifierType,
+  QualifierTypes,
 } from './compare';
 import { RangeStrategy, VersioningApi } from '../common';
 
@@ -88,21 +90,13 @@ const isGreaterThan = (a: string, b: string): boolean => compare(a, b) === 1;
 const isStable = (version: string): boolean | null => {
   if (isVersion(version)) {
     const tokens = tokenize(version);
-    const qualToken = tokens.find(token => token.type === TYPE_QUALIFIER);
-    if (qualToken) {
-      const val = qualToken.val;
-      // TODO: Can this if be removed, we never get here
-      // istanbul ignore if
-      if (
-        val === 'final' ||
-        val === 'ga' ||
-        val === 'release' ||
-        val === 'latest'
-      )
-        return true;
-
-      if (val === 'release' || val === 'sp') return true;
-      return false;
+    for (const token of tokens) {
+      if (token.type === TYPE_QUALIFIER) {
+        const qualType = qualifierType(token);
+        if (qualType && qualType < QualifierTypes.Release) {
+          return false;
+        }
+      }
     }
     return true;
   }
diff --git a/test/versioning/maven.spec.ts b/test/versioning/maven.spec.ts
index 74cb0ca4fd6028c5d2b1c9d56d92d5f20a46c41f..e40d3fc534425c4b7f5eb1dd465305ce8144b6e4 100644
--- a/test/versioning/maven.spec.ts
+++ b/test/versioning/maven.spec.ts
@@ -76,6 +76,8 @@ describe('versioning/maven/compare', () => {
     expect(compare('1-cr1', '1')).toEqual(-1);
     expect(compare('0.0-1552', '1.10.520')).toEqual(-1);
     expect(compare('0.0.1', '999')).toEqual(-1);
+    expect(compare('1.3-RC1-groovy-2.5', '1.3-groovy-2.5')).toEqual(-1);
+    expect(compare('1-abc', '1-xyz')).toEqual(-1);
   });
   it('returns greater than', () => {
     expect(compare('1.1', '1')).toEqual(1);
@@ -94,6 +96,8 @@ describe('versioning/maven/compare', () => {
     expect(compare('1', '1-cr1')).toEqual(1);
     expect(compare('1.10.520', '0.0-1552')).toEqual(1);
     expect(compare('999', '0.0.1')).toEqual(1);
+    expect(compare('1.3-groovy-2.5', '1.3-RC1-groovy-2.5')).toEqual(1);
+    expect(compare('1-xyz', '1-abc')).toEqual(1);
   });
 
   const invalidRanges = [
@@ -275,7 +279,7 @@ describe('versioning/maven/index', () => {
   });
   it('checks if version is stable', () => {
     expect(isStable('')).toBeNull();
-    expect(isStable('foobar')).toBe(false);
+    expect(isStable('foobar')).toBe(true);
     expect(isStable('final')).toBe(true);
     expect(isStable('1')).toBe(true);
     expect(isStable('1.2')).toBe(true);
@@ -284,13 +288,15 @@ describe('versioning/maven/index', () => {
     expect(isStable('v1.2.3.4')).toBe(true);
     expect(isStable('1-alpha-1')).toBe(false);
     expect(isStable('1-b1')).toBe(false);
-    expect(isStable('1-foo')).toBe(false);
+    expect(isStable('1-foo')).toBe(true);
     expect(isStable('1-final-1.0.0')).toBe(true);
     expect(isStable('1-release')).toBe(true);
     expect(isStable('1.final')).toBe(true);
     expect(isStable('1.0milestone1')).toBe(false);
     expect(isStable('1-sp')).toBe(true);
     expect(isStable('1-ga-1')).toBe(true);
+    expect(isStable('1.3-groovy-2.5')).toBe(true);
+    expect(isStable('1.3-RC1-groovy-2.5')).toBe(false);
   });
   it('returns major version', () => {
     expect(getMajor('')).toBeNull();