diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 36adabe..ebebbf1 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -110,7 +110,7 @@
       return;
     }
     if (command.isPrintVersion()) {
-      Version.printToolVersion("D8");
+      System.out.println("D8 " + Version.getVersionString());
       return;
     }
     InternalOptions options = command.getInternalOptions();
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index ab6796b..9e40279 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -886,7 +886,7 @@
       return;
     }
     if (command.isPrintVersion()) {
-      Version.printToolVersion("R8");
+      System.out.println("R8 " + Version.getVersionString());
       return;
     }
     InternalOptions options = command.getInternalOptions();
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 6164e5e..98c654c 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -16,21 +16,79 @@
   private Version() {
   }
 
-  public static void printToolVersion(String toolName) {
-    System.out.println(toolName + " " + Version.LABEL);
-    System.out.println(VersionProperties.INSTANCE.getDescription());
+  /** Returns current R8 version (with additional info) as a string. */
+  public static String getVersionString() {
+    return LABEL + " (" + VersionProperties.INSTANCE.getDescription() + ")";
   }
 
-  /** Is this a development version of the D8/R8 library. */
-  public static boolean isDev() {
+  /**
+   * Returns the major version number of the compiler.
+   *
+   * @return Major version or -1 for an unreleased build.
+   */
+  public static int getMajorVersion() {
+    if (LABEL.equals("master")) {
+      return -1;
+    }
+    int start = 0;
+    int end = LABEL.indexOf('.');
+    return Integer.parseInt(LABEL.substring(start, end));
+  }
+
+  /**
+   * Returns the minor version number of the compiler.
+   *
+   * @return Minor version or -1 for an unreleased build.
+   */
+  public static int getMinorVersion() {
+    if (LABEL.equals("master")) {
+      return -1;
+    }
+    int start = LABEL.indexOf('.') + 1;
+    int end = LABEL.indexOf('.', start);
+    return Integer.parseInt(LABEL.substring(start, end));
+  }
+
+  /**
+   * Returns the patch version number of the compiler.
+   *
+   * @return Patch version or -1 for an unreleased build.
+   */
+  public static int getPatchVersion() {
+    if (LABEL.equals("master")) {
+      return -1;
+    }
+    int skip = LABEL.indexOf('.') + 1;
+    int start = LABEL.indexOf('.', skip) + 1;
+    int end = LABEL.indexOf('.', start);
+    return Integer.parseInt(LABEL.substring(start, end));
+  }
+
+  /**
+   * Returns the pre-release version information of the compiler.
+   *
+   * @return Pre-release information if present, the empty string if absent, and null for an
+   *     unreleased build.
+   */
+  public static String getPreReleaseString() {
+    if (LABEL.equals("master")) {
+      return null;
+    }
+    int start = LABEL.indexOf('-') + 1;
+    if (start > 0) {
+      return LABEL.substring(start);
+    }
+    return "";
+  }
+
+  /**
+   * Is this a development version of the D8/R8 library.
+   *
+   * @return True if the build is not a release or if it is a development release.
+   */
+  public static boolean isDevelopmentVersion() {
     return LABEL.equals("master")
         || LABEL.endsWith("-dev")
         || VersionProperties.INSTANCE.isEngineering();
   }
-
-  /** Returns current R8 version (with additional info) as a string. */
-  @SuppressWarnings("unused") // used by external tools to obtain R8 version
-  public static String getVersionString() {
-    return LABEL + " (" + VersionProperties.INSTANCE.getDescription() + ")";
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/compatdx/CompatDx.java b/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
index 68e9e69..a52c2ea 100644
--- a/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
+++ b/src/main/java/com/android/tools/r8/compatdx/CompatDx.java
@@ -326,7 +326,7 @@
       return;
     }
     if (dexArgs.version) {
-      Version.printToolVersion("CompatDx");
+      System.out.println("CompatDx " + Version.getVersionString());
       return;
     }
     CompilationMode mode = CompilationMode.RELEASE;
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index 514f785..177f2ae 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -173,7 +173,7 @@
   }
 
   private static void printVersion() {
-    Version.printToolVersion("CompatProguard");
+    System.out.println("CompatProguard " + Version.getVersionString());
   }
 
   private static void printHelp() {
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
index 011a7ba..0cee87f 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
@@ -91,7 +91,7 @@
     if (minApiLevel != null) {
       builder.append("# " + MARKER_KEY_MIN_API + ": " + minApiLevel + "\n");
     }
-    if (Version.isDev()) {
+    if (Version.isDevelopmentVersion()) {
       builder.append(
           "# " + MARKER_KEY_COMPILER_HASH + ": " + VersionProperties.INSTANCE.getSha() + "\n");
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 0652a33..cee2d66 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -395,7 +395,7 @@
       } else {
         String unknownOption = acceptString();
         String devMessage = "";
-        if (Version.isDev()
+        if (Version.isDevelopmentVersion()
             && unknownOption != null
             && (unknownOption.equals("forceinline") || unknownOption.equals("neverinline"))) {
           devMessage = ", this option needs to be turned on explicitly if used for tests.";
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index a8f6cbf..dc998e2 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -202,7 +202,8 @@
   public boolean enableDevirtualization = true;
   public boolean enableNonNullTracking = true;
   public boolean enableInlining =
-      !Version.isDev() || System.getProperty("com.android.tools.r8.disableinlining") == null;
+      !Version.isDevelopmentVersion()
+          || System.getProperty("com.android.tools.r8.disableinlining") == null;
   // TODO(b/141451716): Evaluate the effect of allowing inlining in the inlinee.
   public boolean applyInliningToInlinee = false;
   public int applyInliningToInlineeMaxDepth = 0;
@@ -293,7 +294,7 @@
     if (!isGeneratingClassFiles()) {
       marker.setMinApi(minApiLevel);
     }
-    if (Version.isDev()) {
+    if (Version.isDevelopmentVersion()) {
       marker.setSha1(VersionProperties.INSTANCE.getSha());
     }
     return marker;
@@ -985,7 +986,8 @@
     public boolean addCallEdgesForLibraryInvokes = false;
 
     public boolean allowTypeErrors =
-        !Version.isDev() || System.getProperty("com.android.tools.r8.allowTypeErrors") != null;
+        !Version.isDevelopmentVersion()
+            || System.getProperty("com.android.tools.r8.allowTypeErrors") != null;
     public boolean allowInvokeErrors = false;
     public boolean disableL8AnnotationRemoval = false;
     public boolean allowClassInlinerGracefulExit = true;
diff --git a/src/main/keep.txt b/src/main/keep.txt
index 2748f63..d33b879 100644
--- a/src/main/keep.txt
+++ b/src/main/keep.txt
@@ -12,7 +12,13 @@
 -keep public class com.android.tools.r8.compatdx.CompatDx { public static void main(java.lang.String[]); }
 -keep public class com.android.tools.r8.dexfilemerger.DexFileMerger { public static void main(java.lang.String[]); }
 -keep public class com.android.tools.r8.dexsplitter.DexSplitter { public static void main(java.lang.String[]); }
+
 -keep public class com.android.tools.r8.Version { public static java.lang.String getVersionString(); }
+-keep public class com.android.tools.r8.Version { public static int getMajorVersion(); }
+-keep public class com.android.tools.r8.Version { public static int getMinorVersion(); }
+-keep public class com.android.tools.r8.Version { public static int getPatchVersion(); }
+-keep public class com.android.tools.r8.Version { public static java.lang.String getPreReleaseString(); }
+-keep public class com.android.tools.r8.Version { public static boolean isDevelopmentVersion(); }
 
 -keepattributes LineNumberTable, InnerClasses, EnclosingMethod, Exceptions, Signature
 
diff --git a/src/test/java/com/android/tools/r8/VersionTests.java b/src/test/java/com/android/tools/r8/VersionTests.java
new file mode 100644
index 0000000..ba5ee78
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/VersionTests.java
@@ -0,0 +1,65 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+import static com.android.tools.r8.Version.LABEL;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class VersionTests extends TestBase {
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  private final TestParameters parameters;
+
+  public VersionTests(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testSemVerInfo() {
+    int majorVersion = Version.getMajorVersion();
+    int minorVersion = Version.getMinorVersion();
+    int patchVersion = Version.getPatchVersion();
+    String preReleaseString = Version.getPreReleaseString();
+    if (LABEL.equals("master")) {
+      assertEquals(-1, majorVersion);
+      assertEquals(-1, minorVersion);
+      assertEquals(-1, patchVersion);
+      assertNull(preReleaseString);
+      assertTrue(Version.getVersionString().startsWith("master"));
+    } else {
+      assertTrue(majorVersion > 0);
+      assertTrue(minorVersion >= 0);
+      assertTrue(patchVersion >= 0);
+      assertNotNull(preReleaseString);
+      assertTrue(
+          Version.getVersionString()
+              .startsWith(
+                  ""
+                      + majorVersion
+                      + "."
+                      + minorVersion
+                      + "."
+                      + patchVersion
+                      + (preReleaseString.isEmpty() ? "" : "-" + preReleaseString)));
+    }
+  }
+
+  @Test
+  public void testDevelopmentPredicate() {
+    assertEquals(LABEL.equals("master") || LABEL.contains("-dev"), Version.isDevelopmentVersion());
+  }
+}
