diff --git a/build.gradle b/build.gradle
index 4428f58..693cdba 100644
--- a/build.gradle
+++ b/build.gradle
@@ -334,6 +334,7 @@
                 "openjdk/jdk-11-test",
                 "proguard/proguard5.2.1",
                 "proguard/proguard6.0.1",
+                "proguard/proguard-7.0.0",
                 "r8",
                 "r8-releases/2.0.74",
                 "r8mappings",
diff --git a/src/main/java/com/android/tools/r8/ExtractMarker.java b/src/main/java/com/android/tools/r8/ExtractMarker.java
index 0b1fead..c8d6295 100644
--- a/src/main/java/com/android/tools/r8/ExtractMarker.java
+++ b/src/main/java/com/android/tools/r8/ExtractMarker.java
@@ -49,6 +49,11 @@
     return extractMarker(appBuilder.build());
   }
 
+  public static Collection<Marker> extractMarkerFromJarFile(Path file)
+      throws IOException, ExecutionException {
+    return extractMarker(AndroidApp.builder().addProgramFile(file).build());
+  }
+
   public static int extractDexSize(Path file) throws IOException, ResourceException {
     AndroidApp.Builder appBuilder = AndroidApp.builder();
     addDexResources(appBuilder, file);
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index e116676..48f2f7a 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -25,6 +25,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 
 /** Immutable command structure for an invocation of the {@link L8} library compiler. */
@@ -86,6 +87,8 @@
       StringConsumer mainDexListConsumer,
       int minApiLevel,
       Reporter diagnosticsHandler,
+      boolean encodeChecksum,
+      BiPredicate<String, Long> dexClassChecksumFilter,
       DesugaredLibraryConfiguration libraryConfiguration,
       List<AssertionsConfiguration> assertionsConfiguration,
       List<Consumer<Inspector>> outputInspections,
@@ -100,8 +103,8 @@
         diagnosticsHandler,
         DesugarState.ON,
         false,
-        false,
-        (name, checksum) -> true,
+        encodeChecksum,
+        dexClassChecksumFilter,
         assertionsConfiguration,
         outputInspections,
         threadCount);
@@ -296,6 +299,8 @@
                     libraryConfiguration.getSynthesizedLibraryClassesPackagePrefix())
                 .setMinApiLevel(getMinApiLevel())
                 .setMode(getMode())
+                .setIncludeClassesChecksum(getIncludeClassesChecksum())
+                .setDexClassChecksumFilter(getDexClassChecksumFilter())
                 .setProgramConsumer(getProgramConsumer());
         for (ClassFileResourceProvider libraryResourceProvider :
             inputs.getLibraryResourceProviders()) {
@@ -316,6 +321,8 @@
                     libraryConfiguration.getSynthesizedLibraryClassesPackagePrefix())
                 .setMinApiLevel(getMinApiLevel())
                 .setMode(getMode())
+                .setIncludeClassesChecksum(getIncludeClassesChecksum())
+                .setDexClassChecksumFilter(getDexClassChecksumFilter())
                 .setProgramConsumer(getProgramConsumer());
         for (ClassFileResourceProvider libraryResourceProvider :
             inputs.getLibraryResourceProviders()) {
@@ -332,6 +339,8 @@
           getMainDexListConsumer(),
           getMinApiLevel(),
           getReporter(),
+          getIncludeClassesChecksum(),
+          getDexClassChecksumFilter(),
           libraryConfiguration,
           getAssertionsConfiguration(),
           getOutputInspections(),
diff --git a/src/main/java/com/android/tools/r8/dex/Marker.java b/src/main/java/com/android/tools/r8/dex/Marker.java
index 1484f02..e15a4eb 100644
--- a/src/main/java/com/android/tools/r8/dex/Marker.java
+++ b/src/main/java/com/android/tools/r8/dex/Marker.java
@@ -88,6 +88,9 @@
                 new StringDiagnostic(
                     "Merging program compiled with multiple desugared libraries."));
         }
+        if (identifier.equals(NO_LIBRARY_DESUGARING) && marker.tool == Tool.R8) {
+          continue;
+        }
         desugaredLibraryIdentifiers.add(identifier);
       }
     }
@@ -131,6 +134,10 @@
     return this;
   }
 
+  public boolean hasMinApi() {
+    return jsonObject.has(MIN_API);
+  }
+
   public Long getMinApi() {
     return jsonObject.get(MIN_API).getAsLong();
   }
@@ -141,6 +148,10 @@
     return this;
   }
 
+  public boolean hasDesugaredLibraryIdentifiers() {
+    return jsonObject.has(DESUGARED_LIBRARY_IDENTIFIERS);
+  }
+
   public String[] getDesugaredLibraryIdentifiers() {
     if (jsonObject.has(DESUGARED_LIBRARY_IDENTIFIERS)) {
       JsonArray array = jsonObject.get(DESUGARED_LIBRARY_IDENTIFIERS).getAsJsonArray();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
index cfb48f2..be1bbfd 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
@@ -50,10 +50,10 @@
 
   private final AppView<?> appView;
   private final Map<DexMethod, DexMethod> retargetLibraryMember = new IdentityHashMap<>();
-  // Map virtualRewrites hold a methodName->method mapping for virtual methods which are
-  // rewritten while the holder is non final but no superclass implement the method. In this case
-  // d8 needs to force resolution of given methods to see if the invoke needs to be rewritten.
-  private final Map<DexString, List<DexMethod>> virtualRewrites = new IdentityHashMap<>();
+  // Map nonFinalRewrite hold a methodName -> method mapping for methods which are rewritten while
+  // the holder is non final. In this case d8 needs to force resolution of given methods to see if
+  // the invoke needs to be rewritten.
+  private final Map<DexString, List<DexMethod>> nonFinalHolderRewrites = new IdentityHashMap<>();
   // Non final virtual library methods requiring generation of emulated dispatch.
   private final Set<DexEncodedMethod> emulatedDispatchMethods = Sets.newIdentityHashSet();
 
@@ -107,7 +107,7 @@
       InvokeMethod invoke = instruction.asInvokeMethod();
       DexMethod retarget = getRetargetLibraryMember(invoke.getInvokedMethod());
       if (retarget == null) {
-        if (!matchesVirtualRewrite(invoke.getInvokedMethod())) {
+        if (!matchesNonFinalHolderRewrite(invoke.getInvokedMethod())) {
           continue;
         }
         // We need to force resolution, even on d8, to know if the invoke has to be rewritten.
@@ -128,7 +128,7 @@
 
       // Due to emulated dispatch, we have to rewrite invoke-super differently or we end up in
       // infinite loops. We do direct resolution. This is a very uncommon case.
-      if (invoke.isInvokeSuper() && matchesVirtualRewrite(invoke.getInvokedMethod())) {
+      if (invoke.isInvokeSuper() && matchesNonFinalHolderRewrite(invoke.getInvokedMethod())) {
         DexEncodedMethod dexEncodedMethod =
             appView
                 .appInfoForDesugaring()
@@ -163,8 +163,8 @@
     return retargetLibraryMember.get(method);
   }
 
-  private boolean matchesVirtualRewrite(DexMethod method) {
-    List<DexMethod> dexMethods = virtualRewrites.get(method.name);
+  private boolean matchesNonFinalHolderRewrite(DexMethod method) {
+    List<DexMethod> dexMethods = nonFinalHolderRewrites.get(method.name);
     if (dexMethods == null) {
       return false;
     }
@@ -188,17 +188,19 @@
             DexType newHolder = retargetCoreLibMember.get(methodName).get(inType);
             List<DexEncodedMethod> found = findDexEncodedMethodsWithName(methodName, typeClass);
             for (DexEncodedMethod encodedMethod : found) {
-              if (!encodedMethod.isStatic()) {
-                virtualRewrites.putIfAbsent(encodedMethod.method.name, new ArrayList<>());
-                virtualRewrites.get(encodedMethod.method.name).add(encodedMethod.method);
-                if (InterfaceMethodRewriter.isEmulatedInterfaceDispatch(appView, encodedMethod)) {
-                  // In this case interface method rewriter takes care of it.
-                  continue;
-                } else if (!encodedMethod.isFinal()) {
-                  // Virtual rewrites require emulated dispatch for inheritance.
-                  // The call is rewritten to the dispatch holder class instead.
-                  handleEmulateDispatch(appView, encodedMethod);
-                  newHolder = dispatchHolderTypeFor(encodedMethod);
+              if (!typeClass.isFinal()) {
+                nonFinalHolderRewrites.putIfAbsent(encodedMethod.method.name, new ArrayList<>());
+                nonFinalHolderRewrites.get(encodedMethod.method.name).add(encodedMethod.method);
+                if (!encodedMethod.isStatic()) {
+                  if (InterfaceMethodRewriter.isEmulatedInterfaceDispatch(appView, encodedMethod)) {
+                    // In this case interface method rewriter takes care of it.
+                    continue;
+                  } else if (!encodedMethod.isFinal()) {
+                    // Virtual rewrites require emulated dispatch for inheritance.
+                    // The call is rewritten to the dispatch holder class instead.
+                    handleEmulateDispatch(appView, encodedMethod);
+                    newHolder = dispatchHolderTypeFor(encodedMethod);
+                  }
                 }
               }
               DexProto proto = encodedMethod.method.proto;
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
index e0f3cea..6b5829b 100644
--- a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
@@ -56,6 +56,16 @@
     throw new Unimplemented("No support for run class path");
   }
 
+  @Override
+  public GenerateMainDexListTestBuilder addClasspathClasses(Collection<Class<?>> classes) {
+    throw new Unimplemented("No support for class path");
+  }
+
+  @Override
+  public GenerateMainDexListTestBuilder addClasspathFiles(Collection<Path> files) {
+    throw new Unimplemented("No support for class path");
+  }
+
   public GenerateMainDexListRunResult run() throws CompilationFailedException {
     return new GenerateMainDexListRunResult(GenerateMainDexList.run(builder.build()));
   }
diff --git a/src/test/java/com/android/tools/r8/JvmTestBuilder.java b/src/test/java/com/android/tools/r8/JvmTestBuilder.java
index 18571d0..97e244b 100644
--- a/src/test/java/com/android/tools/r8/JvmTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/JvmTestBuilder.java
@@ -82,6 +82,16 @@
   }
 
   @Override
+  public JvmTestBuilder addClasspathClasses(Collection<Class<?>> classes) {
+    return addClasspath(writeClassesToJar(classes));
+  }
+
+  @Override
+  public JvmTestBuilder addClasspathFiles(Collection<Path> files) {
+    return addClasspath(files);
+  }
+
+  @Override
   public JvmTestBuilder addRunClasspathFiles(Collection<Path> files) {
     return addClasspath(files);
   }
diff --git a/src/test/java/com/android/tools/r8/MarkerMatcher.java b/src/test/java/com/android/tools/r8/MarkerMatcher.java
index 90aec54..13065b7 100644
--- a/src/test/java/com/android/tools/r8/MarkerMatcher.java
+++ b/src/test/java/com/android/tools/r8/MarkerMatcher.java
@@ -117,6 +117,20 @@
     };
   }
 
+  public static Matcher<Marker> markerHasMinApi() {
+    return new MarkerMatcher() {
+      @Override
+      protected boolean eval(Marker marker) {
+        return marker.hasMinApi();
+      }
+
+      @Override
+      protected void explain(Description description) {
+        description.appendText(Marker.MIN_API + " found");
+      }
+    };
+  }
+
   public static Matcher<Marker> markerHasChecksums(boolean value) {
     return new MarkerMatcher() {
       @Override
@@ -165,6 +179,25 @@
     };
   }
 
+  public static Matcher<Marker> markerHasDesugaredLibraryIdentifier() {
+    return markerHasDesugaredLibraryIdentifier(true);
+  }
+
+  public static Matcher<Marker> markerHasDesugaredLibraryIdentifier(boolean value) {
+    return new MarkerMatcher() {
+      @Override
+      protected boolean eval(Marker marker) {
+        return marker.hasDesugaredLibraryIdentifiers() == value;
+      }
+
+      @Override
+      protected void explain(Description description) {
+        description.appendText(
+            Marker.DESUGARED_LIBRARY_IDENTIFIERS + (value ? " found" : " not found"));
+      }
+    };
+  }
+
   @Override
   protected boolean matchesSafely(Marker marker) {
     return eval(marker);
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 78eaabf..b764451 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -193,17 +193,22 @@
   }
 
   public TestBuilder<? extends TestRunResult<?>, ?> testForRuntime(
-      TestRuntime runtime, AndroidApiLevel apiLevel) {
+      TestRuntime runtime, Consumer<D8TestBuilder> d8TestBuilderConsumer) {
     if (runtime.isCf()) {
       return testForJvm();
     } else {
       assert runtime.isDex();
       D8TestBuilder d8TestBuilder = testForD8();
-      d8TestBuilder.setMinApi(apiLevel);
+      d8TestBuilderConsumer.accept(d8TestBuilder);
       return d8TestBuilder;
     }
   }
 
+  public TestBuilder<? extends TestRunResult<?>, ?> testForRuntime(
+      TestRuntime runtime, AndroidApiLevel apiLevel) {
+    return testForRuntime(runtime, d8TestBuilder -> d8TestBuilder.setMinApi(apiLevel));
+  }
+
   public TestBuilder<? extends TestRunResult<?>, ?> testForRuntime(TestParameters parameters) {
     return testForRuntime(parameters.getRuntime(), parameters.getApiLevel());
   }
diff --git a/src/test/java/com/android/tools/r8/TestBuilder.java b/src/test/java/com/android/tools/r8/TestBuilder.java
index 21ab2b1..d56f4d9 100644
--- a/src/test/java/com/android/tools/r8/TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestBuilder.java
@@ -131,6 +131,18 @@
     return addLibraryFiles(Arrays.asList(files));
   }
 
+  public T addClasspathClasses(Class<?>... classes) {
+    return addClasspathClasses(Arrays.asList(classes));
+  }
+
+  public abstract T addClasspathClasses(Collection<Class<?>> classes);
+
+  public T addClasspathFiles(Path... files) {
+    return addClasspathFiles(Arrays.asList(files));
+  }
+
+  public abstract T addClasspathFiles(Collection<Path> files);
+
   public final T addTestingAnnotationsAsProgramClasses() {
     return addProgramClasses(getTestingAnnotations());
   }
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index ce6c9fb..9d6b1c8 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -23,7 +23,6 @@
 import java.io.PrintStream;
 import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
@@ -339,18 +338,6 @@
     return super.addLibraryProvider(provider);
   }
 
-  public T addClasspathClasses(Class<?>... classes) {
-    return addClasspathClasses(Arrays.asList(classes));
-  }
-
-  public abstract T addClasspathClasses(Collection<Class<?>> classes);
-
-  public T addClasspathFiles(Path... files) {
-    return addClasspathFiles(Arrays.asList(files));
-  }
-
-  public abstract T addClasspathFiles(Collection<Path> files);
-
   public T noDesugaring() {
     builder.setDisableDesugaring(true);
     return self();
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedFieldTest.java b/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedFieldTest.java
new file mode 100644
index 0000000..efc344e
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedFieldTest.java
@@ -0,0 +1,122 @@
+// Copyright (c) 2020, 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.compatproguard.ifrules;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.shaking.methods.MethodsTestBase.Shrinker;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.StringUtils;
+import java.util.List;
+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 ConditionalOnInlinedFieldTest extends TestBase {
+
+  static class A {
+
+    int field = 42;
+
+    void method(String name, int field) throws Exception {
+      if (field == 42) {
+        Class<?> clazz = Class.forName(name);
+        Object object = clazz.getDeclaredConstructor().newInstance();
+        clazz.getDeclaredMethod("method").invoke(object);
+      }
+    }
+  }
+
+  static class B {
+    void method() {
+      System.out.println("B::method");
+    }
+  }
+
+  static class MainWithFieldReference {
+
+    public static void main(String[] args) throws Exception {
+      A a = new A();
+      a.method(args[0], a.field);
+    }
+  }
+
+  static class MainWithoutFieldReference {
+
+    public static void main(String[] args) throws Exception {
+      A a = new A();
+      a.method(args[0], 42);
+    }
+  }
+
+  private static String EXPECTED = StringUtils.lines("B::method");
+
+  @Parameters(name = "{0}, {1}, ref:{2}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        Shrinker.values(), getTestParameters().withCfRuntimes().build(), BooleanUtils.values());
+  }
+
+  private final Shrinker shrinker;
+  private final TestParameters parameters;
+  private final boolean withFieldReference;
+
+  public ConditionalOnInlinedFieldTest(
+      Shrinker shrinker, TestParameters parameters, boolean withFieldReference) {
+    this.shrinker = shrinker;
+    this.parameters = parameters;
+    this.withFieldReference = withFieldReference;
+  }
+
+  private Class<?> getMain() {
+    return withFieldReference ? MainWithFieldReference.class : MainWithoutFieldReference.class;
+  }
+
+  @Test
+  public void testReference() throws Exception {
+    testForJvm()
+        .addProgramClasses(getMain(), A.class, B.class)
+        .run(parameters.getRuntime(), getMain(), B.class.getTypeName())
+        .assertSuccessWithOutput(EXPECTED);
+  }
+
+  private TestShrinkerBuilder<?, ?, ?, ?, ?> buildShrinker() throws Exception {
+    TestShrinkerBuilder<?, ?, ?, ?, ?> builder;
+    if (shrinker == Shrinker.Proguard) {
+      builder =
+          testForProguard()
+              .addKeepRules("-dontwarn " + ConditionalOnInlinedFieldTest.class.getTypeName());
+    } else if (shrinker == Shrinker.R8Compat) {
+      builder = testForR8Compat(parameters.getBackend());
+    } else {
+      builder = testForR8(parameters.getBackend());
+    }
+    return builder
+        .addProgramClasses(getMain(), A.class, B.class)
+        .addKeepMainRule(getMain())
+        .addKeepRules(
+            "-if class "
+                + A.class.getTypeName()
+                + " { int field; }"
+                + " -keep class "
+                + B.class.getTypeName()
+                + " { void <init>(); void method(); }");
+  }
+
+  @Test
+  public void testConditionalOnField() throws Exception {
+    TestRunResult<?> result =
+        buildShrinker().compile().run(parameters.getRuntime(), getMain(), B.class.getTypeName());
+    if (!withFieldReference && shrinker != Shrinker.Proguard) {
+      // Without the reference we expect an error. For some reason PG keeps in any case.
+      result.assertFailureWithErrorThatThrows(ClassNotFoundException.class);
+    } else {
+      result.assertSuccessWithOutput(EXPECTED);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedTest.java b/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedTest.java
new file mode 100644
index 0000000..faa9eda
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedTest.java
@@ -0,0 +1,124 @@
+// Copyright (c) 2020, 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.compatproguard.ifrules;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.shaking.methods.MethodsTestBase.Shrinker;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+import java.util.List;
+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 ConditionalOnInlinedTest extends TestBase {
+
+  static class A {
+    void method(String name) throws Exception {
+      Class<?> clazz = Class.forName(name);
+      Object object = clazz.getDeclaredConstructor().newInstance();
+      clazz.getDeclaredMethod("method").invoke(object);
+    }
+  }
+
+  static class B {
+    void method() {
+      System.out.println("B::method");
+    }
+  }
+
+  static class Main {
+    public static void main(String[] args) throws Exception {
+      new A().method(args[0]);
+    }
+  }
+
+  private static Class<?> MAIN_CLASS = Main.class;
+  private static Collection<Class<?>> CLASSES = ImmutableList.of(MAIN_CLASS, A.class, B.class);
+
+  private static String EXPECTED = StringUtils.lines("B::method");
+
+  @Parameters(name = "{0}, {1}")
+  public static List<Object[]> data() {
+    return buildParameters(Shrinker.values(), getTestParameters().withCfRuntimes().build());
+  }
+
+  private final Shrinker shrinker;
+  private final TestParameters parameters;
+
+  public ConditionalOnInlinedTest(Shrinker shrinker, TestParameters parameters) {
+    this.shrinker = shrinker;
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testReference() throws Exception {
+    testForJvm()
+        .addProgramClasses(CLASSES)
+        .run(parameters.getRuntime(), MAIN_CLASS, B.class.getTypeName())
+        .assertSuccessWithOutput(EXPECTED);
+  }
+
+  private TestShrinkerBuilder<?, ?, ?, ?, ?> buildShrinker() throws Exception {
+    TestShrinkerBuilder<?, ?, ?, ?, ?> builder;
+    if (shrinker == Shrinker.Proguard) {
+      builder =
+          testForProguard()
+              .addKeepRules("-dontwarn " + ConditionalOnInlinedTest.class.getTypeName());
+    } else if (shrinker == Shrinker.R8Compat) {
+      builder = testForR8Compat(parameters.getBackend());
+    } else {
+      builder = testForR8(parameters.getBackend());
+    }
+    return builder.addProgramClasses(CLASSES).addKeepMainRule(MAIN_CLASS);
+  }
+
+  @Test
+  public void testConditionalOnClass() throws Exception {
+    TestRunResult<?> result =
+        buildShrinker()
+            .addKeepRules(
+                "-if class "
+                    + A.class.getTypeName()
+                    + " -keep class "
+                    + B.class.getTypeName()
+                    + " { void <init>(); void method(); }")
+            .compile()
+            .run(parameters.getRuntime(), MAIN_CLASS, B.class.getTypeName());
+    if (shrinker != Shrinker.Proguard) {
+      // TODO(b/160136641): The conditional rule fails to apply after class A is inlined/removed.
+      result.assertFailureWithErrorThatThrows(ClassNotFoundException.class);
+    } else {
+      result.assertSuccessWithOutput(EXPECTED);
+    }
+  }
+
+  @Test
+  public void testConditionalOnClassAndMethod() throws Exception {
+    TestRunResult<?> result =
+        buildShrinker()
+            .addKeepRules(
+                "-if class "
+                    + A.class.getTypeName()
+                    + " { void method(java.lang.String); }"
+                    + " -keep class "
+                    + B.class.getTypeName()
+                    + " { void <init>(); void method(); }")
+            .compile()
+            .run(parameters.getRuntime(), MAIN_CLASS, B.class.getTypeName());
+    if (shrinker == Shrinker.Proguard) {
+      // In this case PG appears to not actually keep the consequent, but it does remain renamed
+      // in the output.
+      result.assertFailureWithErrorThatThrows(ClassNotFoundException.class);
+    } else {
+      result.assertSuccessWithOutput(EXPECTED);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/compatproguard/reflection/ReflectionTest.java b/src/test/java/com/android/tools/r8/compatproguard/reflection/ReflectionTest.java
index 6a1e059..aab82f0 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/reflection/ReflectionTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/reflection/ReflectionTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.compatproguard.reflection;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -468,15 +468,17 @@
             readClasses(A.class, mainClass), keepMainProguardConfiguration(mainClass), backend);
     CodeInspector inspector = new CodeInspector(output);
 
-    assertThat(inspector.clazz(A.class).method("void", "method0", ImmutableList.of()), isRenamed());
+    assertThat(
+        inspector.clazz(A.class).method("void", "method0", ImmutableList.of()),
+        isPresentAndRenamed());
     assertThat(
         inspector.clazz(A.class).method("void", "method1", ImmutableList.of("java.lang.String")),
-        isRenamed());
+        isPresentAndRenamed());
     assertThat(
         inspector
             .clazz(A.class)
             .method("void", "method2", ImmutableList.of("java.lang.String", "java.lang.String")),
-        isRenamed());
+        isPresentAndRenamed());
 
     assertEquals(runOnJava(mainClass), runOnVM(output, mainClass, backend));
   }
@@ -495,7 +497,9 @@
     AndroidApp output = ToolHelper.runR8(builder.build());
     CodeInspector inspector = new CodeInspector(output);
 
-    assertThat(inspector.clazz(A.class).method("void", "method0", ImmutableList.of()), isRenamed());
+    assertThat(
+        inspector.clazz(A.class).method("void", "method0", ImmutableList.of()),
+        isPresentAndRenamed());
 
     // The reference run on the Java VM will succeed, whereas the run on the R8 output will fail
     // as in this test we fail to recognize the reflective call. To compare the output of the
@@ -535,7 +539,7 @@
         .forAllMethods(
             m -> {
               if (!m.isInstanceInitializer()) {
-                assertThat(m, isRenamed());
+                assertThat(m, isPresentAndRenamed());
               }
             });
 
@@ -556,7 +560,7 @@
         .forAllMethods(
             m -> {
               if (!m.isInstanceInitializer()) {
-                assertThat(m, isRenamed());
+                assertThat(m, isPresentAndRenamed());
               }
             });
 
diff --git a/src/test/java/com/android/tools/r8/desugar/DefaultInterfaceWithIdentifierNameString.java b/src/test/java/com/android/tools/r8/desugar/DefaultInterfaceWithIdentifierNameString.java
index 211050e..9eb054c 100644
--- a/src/test/java/com/android/tools/r8/desugar/DefaultInterfaceWithIdentifierNameString.java
+++ b/src/test/java/com/android/tools/r8/desugar/DefaultInterfaceWithIdentifierNameString.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.desugar;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -54,9 +54,9 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(A.class);
-    assertThat(classSubject, isRenamed());
+    assertThat(classSubject, isPresentAndRenamed());
     ClassSubject companionClassSubject = inspector.companionClassFor(I.class);
-    assertThat(companionClassSubject, isRenamed());
+    assertThat(companionClassSubject, isPresentAndRenamed());
     companionClassSubject
         .allMethods()
         .forEach(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibaryChecksumsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
similarity index 70%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibaryChecksumsTest.java
rename to src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
index 8280f92..6aff20f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibaryChecksumsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
@@ -3,10 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.desugar.desugaredlibrary;
 
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertTrue;
-
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.L8;
 import com.android.tools.r8.L8Command;
@@ -16,7 +12,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
@@ -26,14 +21,14 @@
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class DesugaredLibaryChecksumsTest extends TestBase {
+public class DesugaredLibraryChecksumsTest extends TestBase {
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
     return getTestParameters().withNoneRuntime().build();
   }
 
-  public DesugaredLibaryChecksumsTest(TestParameters parameters) {
+  public DesugaredLibraryChecksumsTest(TestParameters parameters) {
     parameters.assertNoneRuntime();
   }
 
@@ -52,16 +47,9 @@
             .setMinApiLevel(AndroidApiLevel.B.getLevel())
             .setOutput(out, OutputMode.DexIndexed)
             .build());
-
-    try {
-      CodeInspector inspector = new CodeInspector(out);
-      for (FoundClassSubject clazz : inspector.allClasses()) {
-        assertTrue(clazz.getDexProgramClass().getChecksum() > 0);
-      }
-    } catch (CompilationError e) {
-      // TODO(b/158746302): Desugared library should support checksums.
-      //  also, the failure should have occured in the L8.run above!
-      assertThat(e.getMessage(), containsString("has no checksum"));
+    CodeInspector inspector = new CodeInspector(out);
+    for (FoundClassSubject clazz : inspector.allClasses()) {
+      clazz.getDexProgramClass().getChecksum();
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
index 03052cc..f485a25 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
@@ -4,22 +4,35 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary;
 
+import static com.android.tools.r8.MarkerMatcher.assertMarkersMatch;
+import static com.android.tools.r8.MarkerMatcher.markerCompilationMode;
+import static com.android.tools.r8.MarkerMatcher.markerHasDesugaredLibraryIdentifier;
+import static com.android.tools.r8.MarkerMatcher.markerHasMinApi;
+import static com.android.tools.r8.MarkerMatcher.markerTool;
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8TestCompileResult;
 import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.ExtractMarker;
 import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11DesugaredLibraryTestBase;
+import com.android.tools.r8.dex.Marker;
+import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
+import org.hamcrest.Matcher;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -69,6 +82,47 @@
         .assertSuccessWithOutputLines(JAVA_RESULT);
   }
 
+  @Test
+  public void testMergeDesugaredWithShrunkenLib() throws Exception {
+    // Compile a library with R8 to CF.
+    Path shrunkenLib =
+        testForR8(Backend.CF)
+            .addProgramClasses(Part2.class)
+            .addKeepClassRules(Part2.class)
+            .compile()
+            .writeToZip();
+
+    // R8 class file output marker has no library desugaring identifier.
+    Matcher<Marker> libraryMatcher =
+        allOf(
+            markerTool(Tool.R8),
+            markerCompilationMode(CompilationMode.RELEASE),
+            not(markerHasMinApi()),
+            not(markerHasDesugaredLibraryIdentifier()));
+    assertMarkersMatch(
+        ExtractMarker.extractMarkerFromJarFile(shrunkenLib), ImmutableList.of(libraryMatcher));
+
+    // Build an app with the R8 compiled library.
+    Path app =
+        testForD8()
+            .addProgramFiles(buildPart1DesugaredLibrary(), shrunkenLib)
+            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .setMinApi(parameters.getApiLevel())
+            .enableCoreLibraryDesugaring(parameters.getApiLevel())
+            .compile()
+            .writeToZip();
+
+    // The app has both the R8 marker from the library compilation and the D8 marker from dexing.
+    Matcher<Marker> d8Matcher =
+        allOf(
+            markerTool(Tool.D8),
+            markerHasMinApi(),
+            markerHasDesugaredLibraryIdentifier(
+                parameters.getApiLevel().isLessThan(AndroidApiLevel.O)));
+    assertMarkersMatch(
+        ExtractMarker.extractMarkerFromDexFile(app), ImmutableList.of(libraryMatcher, d8Matcher));
+  }
+
   private void assertError(TestDiagnosticMessages m) {
     List<Diagnostic> errors = m.getErrors();
     if (expectError()) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
index 32bbe65..c2d88b0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
@@ -123,19 +123,12 @@
       System.out.println(myAtomicInteger.updateAndGet(x -> x + 100));
       System.out.println("145");
 
-      try {
-        MyDateNoOverride.from(myCal.toInstant());
-        System.out.println("b/159441805 fixed");
-      } catch (NoSuchMethodError e) {
-        // TODO(b/159441805): Should not throw.
-      }
-
-      try {
-        MyDateOverride.from(myCal.toInstant());
-        System.out.println("b/159441805 fixed");
-      } catch (NoSuchMethodError e) {
-        // TODO(b/159441805): Should not throw.
-      }
+      Date date1 = MyDateNoOverride.from(myCal.toInstant());
+      System.out.println(date1.toInstant());
+      System.out.println("1990-03-22T00:00:00Z");
+      Date date2 = MyDateOverride.from(myCal.toInstant());
+      System.out.println(date2.toInstant());
+      System.out.println("1990-03-22T00:00:00Z");
 
       System.out.println(MyDateDoubleOverride.from(myCal.toInstant()).toInstant());
       System.out.println("1970-01-02T10:17:36.788Z");
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java b/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
index b91a645..351a74e 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
@@ -5,7 +5,6 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.TestBase;
@@ -83,7 +82,7 @@
   private void checkIncludesChecksum(CodeInspector inspector, Class<?> clazz) {
     ClassSubject classSubject = inspector.clazz(getTransformedName(clazz));
     assertThat(classSubject, isPresent());
-    assertTrue(classSubject.getDexProgramClass().asProgramClass().getChecksum() > 0);
+    classSubject.getDexProgramClass().getChecksum();
   }
 
   static class TaestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
index 1c9148a..ec3c011 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
@@ -6,7 +6,7 @@
 
 import static com.android.tools.r8.ir.optimize.inliner.testclasses.InliningIntoVisibilityBridgeTestClasses.getClassA;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -74,8 +74,7 @@
       assertThat(classSubject, isPresent());
 
       MethodSubject methodSubject = classSubject.uniqueMethodWithName("method");
-      assertThat(methodSubject, isPresent());
-      assertThat(methodSubject, isRenamed());
+      assertThat(methodSubject, isPresentAndRenamed());
       assertEquals(neverInline, methodSubject.isBridge());
       assertEquals(neverInline, methodSubject.isSynthetic());
     }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java
index 11c47de..0b65d77 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java
@@ -5,9 +5,9 @@
 package com.android.tools.r8.kotlin.metadata;
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isNotRenamed;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -150,12 +150,11 @@
   private void inspect(CodeInspector inspector) {
     // Assert that foo is renamed.
     ClassSubject foo = inspector.clazz(PKG_LIB + ".Foo");
-    assertThat(foo, isRenamed());
+    assertThat(foo, isPresentAndRenamed());
     assertEquals(FOO_FINAL_NAME, foo.getFinalName());
     // Assert that bar exists and is not renamed.
     ClassSubject bar = inspector.clazz(PKG_LIB + ".Bar");
-    assertThat(bar, isPresent());
-    assertThat(bar, isNotRenamed());
+    assertThat(bar, isPresentAndNotRenamed());
     // Check that the annotation type on the type alias has been renamed
     inspectTypeAliasAnnotation(inspector, foo, bar);
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnonymousTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnonymousTest.java
index f4ee57a..14cbe0b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnonymousTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnonymousTest.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.kotlin.metadata;
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestParameters;
@@ -108,6 +108,6 @@
     System.out.println(
         KotlinMetadataWriter.kotlinMetadataToString("", clazz.getKotlinClassMetadata()));
     ClassSubject anonymousClass = inspector.clazz(PKG + ".anonymous_lib.Test$internalProp$1");
-    assertThat(anonymousClass, isRenamed());
+    assertThat(anonymousClass, isPresentAndRenamed());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteFlexibleUpperBoundTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteFlexibleUpperBoundTest.java
index 90b74f9..d5b9fd0 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteFlexibleUpperBoundTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteFlexibleUpperBoundTest.java
@@ -6,8 +6,8 @@
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -120,11 +120,10 @@
     // We are checking that A is renamed, and that the flexible upper bound information is
     // reflecting that.
     ClassSubject a = inspector.clazz(PKG_LIB + ".A");
-    assertThat(a, isRenamed());
+    assertThat(a, isPresentAndRenamed());
 
     ClassSubject flexibleUpperBound = inspector.clazz(PKG_LIB + ".FlexibleUpperBound");
-    assertThat(flexibleUpperBound, isPresent());
-    assertThat(flexibleUpperBound, not(isRenamed()));
+    assertThat(flexibleUpperBound, isPresentAndNotRenamed());
 
     List<KmPropertySubject> properties = flexibleUpperBound.getKmClass().getProperties();
     assertEquals(1, properties.size());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInClasspathTypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInClasspathTypeTest.java
index 4aa0a2c..2103f0d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInClasspathTypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInClasspathTypeTest.java
@@ -6,8 +6,8 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -129,11 +129,10 @@
     String extraClassName = PKG + ".classpath_lib_ext.Extra";
 
     ClassSubject impl = inspector.clazz(implClassName);
-    assertThat(impl, isRenamed());
+    assertThat(impl, isPresentAndRenamed());
 
     ClassSubject implKt = inspector.clazz(implKtClassName);
-    assertThat(implKt, isPresent());
-    assertThat(implKt, not(isRenamed()));
+    assertThat(implKt, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = implKt.getKmPackage();
     assertThat(kmPackage, isPresent());
@@ -142,8 +141,7 @@
     assertThat(kmFunction, isExtensionFunction());
 
     ClassSubject extra = inspector.clazz(extraClassName);
-    assertThat(extra, isPresent());
-    assertThat(extra, not(isRenamed()));
+    assertThat(extra, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = extra.getKmClass();
     assertThat(kmClass, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInCompanionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInCompanionTest.java
index 38a6815..4c49518 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInCompanionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInCompanionTest.java
@@ -5,7 +5,8 @@
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -170,15 +171,13 @@
 
     ClassSubject sup = inspector.clazz(superClassName);
     if (keptAll) {
-      assertThat(sup, isPresent());
-      assertThat(sup, not(isRenamed()));
+      assertThat(sup, isPresentAndNotRenamed());
     } else {
-      assertThat(sup, isRenamed());
+      assertThat(sup, isPresentAndRenamed());
     }
 
     ClassSubject impl = inspector.clazz(bClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
@@ -192,21 +191,18 @@
 
     // The backing field for the property in the companion, with @JvmField
     FieldSubject elt2 = impl.uniqueFieldWithName("elt2");
-    assertThat(elt2, isPresent());
-    assertThat(elt2, not(isRenamed()));
+    assertThat(elt2, isPresentAndNotRenamed());
 
     FieldSubject companionObject = impl.uniqueFieldWithName("Companion");
-    assertThat(companionObject, isPresent());
-    assertThat(companionObject, not(isRenamed()));
+    assertThat(companionObject, isPresentAndNotRenamed());
     assertEquals(companionObject.getFinalName(), kmClass.getCompanionObject());
 
     // Bridge for the property in the companion that needs a backing field.
     MethodSubject elt1Bridge = impl.uniqueMethodWithName("access$getElt1$cp");
     if (keptAll) {
-      assertThat(elt1Bridge, isPresent());
-      assertThat(elt1Bridge, not(isRenamed()));
+      assertThat(elt1Bridge, isPresentAndNotRenamed());
     } else {
-      assertThat(elt1Bridge, isRenamed());
+      assertThat(elt1Bridge, isPresentAndRenamed());
     }
 
     // With @JvmField, no bridge is added.
@@ -218,8 +214,7 @@
     assertThat(fooBridge, not(isPresent()));
 
     ClassSubject companion = inspector.clazz(companionClassName);
-    assertThat(companion, isPresent());
-    assertThat(companion, not(isRenamed()));
+    assertThat(companion, isPresentAndNotRenamed());
 
     List<String> nestedClassDescriptors = kmClass.getNestedClassDescriptors();
     assertEquals(1, nestedClassDescriptors.size());
@@ -236,19 +231,16 @@
     assertThat(kmProperty, isPresent());
 
     MethodSubject elt1Getter = companion.uniqueMethodWithName("getElt1");
-    assertThat(elt1Getter, isPresent());
-    assertThat(elt1Getter, not(isRenamed()));
+    assertThat(elt1Getter, isPresentAndNotRenamed());
 
     // Note that there is no getter for property with @JvmField.
     MethodSubject elt2Getter = companion.uniqueMethodWithName("getElt2");
     assertThat(elt2Getter, not(isPresent()));
 
     MethodSubject fooGetter = companion.uniqueMethodWithName("getFoo");
-    assertThat(fooGetter, isPresent());
-    assertThat(fooGetter, not(isRenamed()));
+    assertThat(fooGetter, isPresentAndNotRenamed());
 
     MethodSubject barSetter = companion.uniqueMethodWithName("setBar");
-    assertThat(barSetter, isPresent());
-    assertThat(barSetter, not(isRenamed()));
+    assertThat(barSetter, isPresentAndNotRenamed());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
index 41d1f09..4f8b4a4 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
@@ -6,7 +6,8 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -127,8 +128,7 @@
     assertThat(inspector.clazz(superClassName), not(isPresent()));
 
     ClassSubject impl = inspector.clazz(bClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
@@ -180,12 +180,10 @@
     String bClassName = PKG + ".extension_function_lib.B";
 
     ClassSubject sup = inspector.clazz(superClassName);
-    assertThat(sup, isPresent());
-    assertThat(sup, isRenamed());
+    assertThat(sup, isPresentAndRenamed());
 
     ClassSubject impl = inspector.clazz(bClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
@@ -206,8 +204,7 @@
     assertThat(impl, isPresent());
 
     ClassSubject bKt = inspector.clazz(bKtClassName);
-    assertThat(bKt, isPresent());
-    assertThat(bKt, not(isRenamed()));
+    assertThat(bKt, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = bKt.getKmPackage();
     assertThat(kmPackage, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionPropertyTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionPropertyTest.java
index c627171..9e81bf2 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionPropertyTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionPropertyTest.java
@@ -7,7 +7,8 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionProperty;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNotNull;
@@ -124,8 +125,7 @@
     assertThat(inspector.clazz(superClassName), not(isPresent()));
 
     ClassSubject impl = inspector.clazz(bClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
@@ -137,8 +137,7 @@
     assertThat(kmFunction, not(isExtensionFunction()));
 
     ClassSubject bKt = inspector.clazz(bKtClassName);
-    assertThat(bKt, isPresent());
-    assertThat(bKt, not(isRenamed()));
+    assertThat(bKt, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = bKt.getKmPackage();
     assertThat(kmPackage, isPresent());
@@ -187,11 +186,10 @@
     String bKtClassName = PKG + ".extension_property_lib.BKt";
 
     ClassSubject sup = inspector.clazz(superClassName);
-    assertThat(sup, isRenamed());
+    assertThat(sup, isPresentAndRenamed());
 
     ClassSubject impl = inspector.clazz(bClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
@@ -202,8 +200,7 @@
         supertype -> supertype.getFinalDescriptor().equals(sup.getFinalDescriptor())));
 
     ClassSubject bKt = inspector.clazz(bKtClassName);
-    assertThat(bKt, isPresent());
-    assertThat(bKt, not(isRenamed()));
+    assertThat(bKt, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = bKt.getKmPackage();
     assertThat(kmPackage, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionTest.java
index 7cfa4a7..dcb6dbe 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionTest.java
@@ -6,7 +6,8 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -122,8 +123,7 @@
     assertThat(inspector.clazz(superClassName), not(isPresent()));
 
     ClassSubject impl = inspector.clazz(bClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
 
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
@@ -133,8 +133,7 @@
         supertype -> supertype.getFinalDescriptor().contains("Super")));
 
     ClassSubject bKt = inspector.clazz(bKtClassName);
-    assertThat(bKt, isPresent());
-    assertThat(bKt, not(isRenamed()));
+    assertThat(bKt, isPresentAndNotRenamed());
 
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = bKt.getKmPackage();
@@ -183,10 +182,10 @@
     String bKtClassName = PKG + ".function_lib.BKt";
 
     ClassSubject sup = inspector.clazz(superClassName);
-    assertThat(sup, isRenamed());
+    assertThat(sup, isPresentAndRenamed());
 
     MethodSubject foo = sup.uniqueMethodWithName("foo");
-    assertThat(foo, isRenamed());
+    assertThat(foo, isPresentAndRenamed());
 
     KmClassSubject kmClass = sup.getKmClass();
     assertThat(kmClass, isPresent());
@@ -198,8 +197,7 @@
     assertEquals(foo.getJvmMethodSignatureAsString(), kmFunction.signature().asString());
 
     ClassSubject impl = inspector.clazz(bClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
 
     // API entry is kept, hence the presence of Metadata.
     kmClass = impl.getKmClass();
@@ -211,8 +209,7 @@
         supertype -> supertype.getFinalDescriptor().equals(sup.getFinalDescriptor())));
 
     ClassSubject bKt = inspector.clazz(bKtClassName);
-    assertThat(bKt, isPresent());
-    assertThat(bKt, not(isRenamed()));
+    assertThat(bKt, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = bKt.getKmPackage();
     assertThat(kmPackage, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
index 79ad6e5..4cd9b6a 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
@@ -6,8 +6,7 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -120,16 +119,13 @@
     String libClassName = PKG + ".default_value_lib.LibKt";
 
     ClassSubject libKt = inspector.clazz(libClassName);
-    assertThat(libKt, isPresent());
-    assertThat(libKt, not(isRenamed()));
+    assertThat(libKt, isPresentAndNotRenamed());
 
     MethodSubject methodSubject = libKt.uniqueMethodWithName("applyMap");
-    assertThat(methodSubject, isPresent());
-    assertThat(methodSubject, not(isRenamed()));
+    assertThat(methodSubject, isPresentAndNotRenamed());
 
     methodSubject = libKt.uniqueMethodWithName("applyMap$default");
-    assertThat(methodSubject, isPresent());
-    assertThat(methodSubject, not(isRenamed()));
+    assertThat(methodSubject, isPresentAndNotRenamed());
 
     KmPackageSubject kmPackage = libKt.getKmPackage();
     assertThat(kmPackage, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
index d82b5c6..0914a23 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
@@ -6,7 +6,7 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -123,20 +123,16 @@
     String libClassName = PKG + ".vararg_lib.LibKt";
 
     ClassSubject cls = inspector.clazz(className);
-    assertThat(cls, isPresent());
-    assertThat(cls, not(isRenamed()));
+    assertThat(cls, isPresentAndNotRenamed());
 
     MethodSubject foo = cls.uniqueMethodWithName("foo");
-    assertThat(foo, isPresent());
-    assertThat(foo, not(isRenamed()));
+    assertThat(foo, isPresentAndNotRenamed());
 
     ClassSubject libKt = inspector.clazz(libClassName);
-    assertThat(libKt, isPresent());
-    assertThat(libKt, not(isRenamed()));
+    assertThat(libKt, isPresentAndNotRenamed());
 
     MethodSubject bar = libKt.uniqueMethodWithName("bar");
-    assertThat(bar, isPresent());
-    assertThat(bar, not(isRenamed()));
+    assertThat(bar, isPresentAndNotRenamed());
 
     KmPackageSubject kmPackage = libKt.getKmPackage();
     assertThat(kmPackage, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInLibraryTypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInLibraryTypeTest.java
index 12b361b..159bf66 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInLibraryTypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInLibraryTypeTest.java
@@ -5,10 +5,9 @@
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.CoreMatchers.anyOf;
 import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -122,8 +121,7 @@
   private void inspect(CodeInspector inspector) {
     String extClassName = PKG + ".libtype_lib_ext.ExtKt";
     ClassSubject ext = inspector.clazz(extClassName);
-    assertThat(ext, isPresent());
-    assertThat(ext, not(isRenamed()));
+    assertThat(ext, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = ext.getKmPackage();
     assertThat(kmPackage, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInMultifileClassTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInMultifileClassTest.java
index 09d62d7..45a419d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInMultifileClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInMultifileClassTest.java
@@ -6,7 +6,8 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -121,11 +122,9 @@
     String utilClassName = PKG + ".multifileclass_lib.UtilKt";
 
     ClassSubject util = inspector.clazz(utilClassName);
-    assertThat(util, isPresent());
-    assertThat(util, not(isRenamed()));
+    assertThat(util, isPresentAndNotRenamed());
     MethodSubject commaJoinOfInt = util.uniqueMethodWithName("commaSeparatedJoinOfInt");
-    assertThat(commaJoinOfInt, isPresent());
-    assertThat(commaJoinOfInt, not(isRenamed()));
+    assertThat(commaJoinOfInt, isPresentAndNotRenamed());
     MethodSubject joinOfInt = util.uniqueMethodWithName("joinOfInt");
     assertThat(joinOfInt, not(isPresent()));
 
@@ -167,14 +166,11 @@
     String utilClassName = PKG + ".multifileclass_lib.UtilKt";
 
     ClassSubject util = inspector.clazz(utilClassName);
-    assertThat(util, isPresent());
-    assertThat(util, not(isRenamed()));
+    assertThat(util, isPresentAndNotRenamed());
     MethodSubject commaJoinOfInt = util.uniqueMethodWithName("commaSeparatedJoinOfInt");
-    assertThat(commaJoinOfInt, isPresent());
-    assertThat(commaJoinOfInt, not(isRenamed()));
+    assertThat(commaJoinOfInt, isPresentAndNotRenamed());
     MethodSubject joinOfInt = util.uniqueMethodWithName("joinOfInt");
-    assertThat(joinOfInt, isPresent());
-    assertThat(joinOfInt, isRenamed());
+    assertThat(joinOfInt, isPresentAndRenamed());
 
     inspectMetadataForFacade(inspector, util);
 
@@ -195,19 +191,18 @@
     for (String partClassName : partClassNames) {
       ClassSubject partClass =
           inspector.clazz(DescriptorUtils.getJavaTypeFromBinaryName(partClassName));
-      assertThat(partClass, isRenamed());
+      assertThat(partClass, isPresentAndRenamed());
     }
   }
 
   private void inspectSignedKt(CodeInspector inspector) {
     String signedClassName = PKG + ".multifileclass_lib.UtilKt__SignedKt";
     ClassSubject signed = inspector.clazz(signedClassName);
-    assertThat(signed, isRenamed());
+    assertThat(signed, isPresentAndRenamed());
     MethodSubject commaJoinOfInt = signed.uniqueMethodWithName("commaSeparatedJoinOfInt");
-    assertThat(commaJoinOfInt, isPresent());
-    assertThat(commaJoinOfInt, not(isRenamed()));
+    assertThat(commaJoinOfInt, isPresentAndNotRenamed());
     MethodSubject joinOfInt = signed.uniqueMethodWithName("joinOfInt");
-    assertThat(joinOfInt, isRenamed());
+    assertThat(joinOfInt, isPresentAndRenamed());
 
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = signed.getKmPackage();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInNestedClassTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInNestedClassTest.java
index 3c218fe..eada4da 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInNestedClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInNestedClassTest.java
@@ -6,8 +6,8 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.DescriptorUtils.descriptorToJavaType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -119,28 +119,30 @@
     String nestedClassName = outerClassName + "$Nested";
 
     ClassSubject inner = inspector.clazz(innerClassName);
-    assertThat(inner, isPresent());
-    assertThat(inner, not(isRenamed()));
+    assertThat(inner, isPresentAndNotRenamed());
 
     ClassSubject nested = inspector.clazz(nestedClassName);
-    assertThat(nested, isRenamed());
+    assertThat(nested, isPresentAndRenamed());
 
     ClassSubject outer = inspector.clazz(outerClassName);
-    assertThat(outer, isPresent());
-    assertThat(outer, not(isRenamed()));
+    assertThat(outer, isPresentAndNotRenamed());
 
     KmClassSubject kmClass = outer.getKmClass();
     assertThat(kmClass, isPresent());
 
     assertFalse(kmClass.getNestedClassDescriptors().isEmpty());
-    kmClass.getNestedClassDescriptors().forEach(nestedClassDescriptor -> {
-      ClassSubject nestedClass = inspector.clazz(descriptorToJavaType(nestedClassDescriptor));
-      if (nestedClass.getOriginalName().contains("Inner")) {
-        assertThat(nestedClass, not(isRenamed()));
-      } else {
-        assertThat(nestedClass, isRenamed());
-      }
-      assertEquals(nestedClassDescriptor, nestedClass.getFinalDescriptor());
-    });
+    kmClass
+        .getNestedClassDescriptors()
+        .forEach(
+            nestedClassDescriptor -> {
+              ClassSubject nestedClass =
+                  inspector.clazz(descriptorToJavaType(nestedClassDescriptor));
+              if (nestedClass.getOriginalName().contains("Inner")) {
+                assertThat(nestedClass, isPresentAndNotRenamed());
+              } else {
+                assertThat(nestedClass, isPresentAndRenamed());
+              }
+              assertEquals(nestedClassDescriptor, nestedClass.getFinalDescriptor());
+            });
   }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInParameterTypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInParameterTypeTest.java
index 53c8e4f..b4ae665 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInParameterTypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInParameterTypeTest.java
@@ -5,8 +5,8 @@
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -112,11 +112,10 @@
     String implClassName = PKG + ".parametertype_lib.Impl";
 
     ClassSubject itf = inspector.clazz(itfClassName);
-    assertThat(itf, isRenamed());
+    assertThat(itf, isPresentAndRenamed());
 
     ClassSubject impl = inspector.clazz(implClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTest.java
index f97fd1c..c479093 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTest.java
@@ -6,7 +6,8 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionProperty;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static junit.framework.TestCase.assertNull;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -116,14 +117,12 @@
   private void inspectGetterOnly(CodeInspector inspector) {
     String personClassName = PKG + ".fragile_property_lib.Person";
     ClassSubject person = inspector.clazz(personClassName);
-    assertThat(person, isPresent());
-    assertThat(person, not(isRenamed()));
+    assertThat(person, isPresentAndNotRenamed());
 
     FieldSubject backingField = person.uniqueFieldWithName("name");
-    assertThat(backingField, isRenamed());
+    assertThat(backingField, isPresentAndRenamed());
     MethodSubject getterForName = person.uniqueMethodWithName("getName");
-    assertThat(getterForName, isPresent());
-    assertThat(getterForName, not(isRenamed()));
+    assertThat(getterForName, isPresentAndNotRenamed());
     MethodSubject setterForName = person.uniqueMethodWithName("setName");
     assertThat(setterForName, not(isPresent()));
 
@@ -213,8 +212,7 @@
   private void inspectSetterOnly(CodeInspector inspector) {
     String personClassName = PKG + ".fragile_property_lib.Person";
     ClassSubject person = inspector.clazz(personClassName);
-    assertThat(person, isPresent());
-    assertThat(person, not(isRenamed()));
+    assertThat(person, isPresentAndNotRenamed());
 
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = person.getKmClass();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTypeTest.java
index dea1c4a..eb9ff61 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTypeTest.java
@@ -5,8 +5,8 @@
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -110,11 +110,10 @@
     String implClassName = PKG + ".propertytype_lib.Impl";
 
     ClassSubject itf = inspector.clazz(itfClassName);
-    assertThat(itf, isRenamed());
+    assertThat(itf, isPresentAndRenamed());
 
     ClassSubject impl = inspector.clazz(implClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java
index f474cf1..bb77f38 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java
@@ -6,9 +6,9 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.DescriptorUtils.getDescriptorFromKotlinClassifier;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -115,8 +115,7 @@
   private void inspect(CodeInspector inspector) {
     String pkg = getClass().getPackage().getName();
     ClassSubject kept = inspector.clazz(pkg + ".anno.Kept");
-    assertThat(kept, isPresent());
-    assertThat(kept, not(isRenamed()));
+    assertThat(kept, isPresentAndNotRenamed());
     // API entry is kept, hence @Metadata exists.
     KmClassSubject kmClass = kept.getKmClass();
     assertThat(kmClass, isPresent());
@@ -127,7 +126,7 @@
     assertThat(anno, isPresent());
 
     ClassSubject renamed = inspector.clazz(pkg + ".anno.Renamed");
-    assertThat(renamed, isRenamed());
+    assertThat(renamed, isPresentAndRenamed());
     // @Anno is kept.
     anno = renamed.annotation(annoName);
     assertThat(anno, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInReturnTypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInReturnTypeTest.java
index 63fc38d..47b0b82 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInReturnTypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInReturnTypeTest.java
@@ -5,8 +5,8 @@
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -112,11 +112,10 @@
     String implClassName = PKG + ".returntype_lib.Impl";
 
     ClassSubject itf = inspector.clazz(itfClassName);
-    assertThat(itf, isRenamed());
+    assertThat(itf, isPresentAndRenamed());
 
     ClassSubject impl = inspector.clazz(implClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInSealedClassTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInSealedClassTest.java
index 318a765..1bb1c44 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInSealedClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInSealedClassTest.java
@@ -7,9 +7,9 @@
 import static com.android.tools.r8.utils.DescriptorUtils.descriptorToJavaType;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -122,26 +122,27 @@
     String libClassName = PKG + ".sealed_lib.LibKt";
 
     ClassSubject num = inspector.clazz(numClassName);
-    assertThat(num, isRenamed());
+    assertThat(num, isPresentAndRenamed());
 
     ClassSubject expr = inspector.clazz(exprClassName);
-    assertThat(expr, isPresent());
-    assertThat(expr, not(isRenamed()));
+    assertThat(expr, isPresentAndNotRenamed());
 
     KmClassSubject kmClass = expr.getKmClass();
     assertThat(kmClass, isPresent());
 
     assertFalse(kmClass.getSealedSubclassDescriptors().isEmpty());
-    kmClass.getSealedSubclassDescriptors().forEach(sealedSubclassDescriptor -> {
-      ClassSubject sealedSubclass =
-          inspector.clazz(descriptorToJavaType(sealedSubclassDescriptor));
-      assertThat(sealedSubclass, isRenamed());
-      assertEquals(sealedSubclassDescriptor, sealedSubclass.getFinalDescriptor());
-    });
+    kmClass
+        .getSealedSubclassDescriptors()
+        .forEach(
+            sealedSubclassDescriptor -> {
+              ClassSubject sealedSubclass =
+                  inspector.clazz(descriptorToJavaType(sealedSubclassDescriptor));
+              assertThat(sealedSubclass, isPresentAndRenamed());
+              assertEquals(sealedSubclassDescriptor, sealedSubclass.getFinalDescriptor());
+            });
 
     ClassSubject libKt = inspector.clazz(libClassName);
-    assertThat(expr, isPresent());
-    assertThat(expr, not(isRenamed()));
+    assertThat(expr, isPresentAndNotRenamed());
 
     KmPackageSubject kmPackage = libKt.getKmPackage();
     assertThat(kmPackage, isPresent());
@@ -184,15 +185,13 @@
     String libClassName = PKG + ".sealed_lib.LibKt";
 
     ClassSubject expr = inspector.clazz(exprClassName);
-    assertThat(expr, isPresent());
-    assertThat(expr, not(isRenamed()));
+    assertThat(expr, isPresentAndNotRenamed());
 
     KmClassSubject kmClass = expr.getKmClass();
     assertThat(kmClass, isPresent());
 
     ClassSubject libKt = inspector.clazz(libClassName);
-    assertThat(expr, isPresent());
-    assertThat(expr, not(isRenamed()));
+    assertThat(expr, isPresentAndNotRenamed());
 
     KmPackageSubject kmPackage = libKt.getKmPackage();
     assertThat(kmPackage, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInSuperTypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInSuperTypeTest.java
index 8eb76bb..578a7ec 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInSuperTypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInSuperTypeTest.java
@@ -5,7 +5,8 @@
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -114,8 +115,7 @@
     assertThat(inspector.clazz(itfClassName), not(isPresent()));
 
     ClassSubject impl = inspector.clazz(implClassName);
-    assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
@@ -160,11 +160,11 @@
     String implClassName = PKG + ".supertype_lib.Impl";
 
     ClassSubject itf = inspector.clazz(itfClassName);
-    assertThat(itf, isRenamed());
+    assertThat(itf, isPresentAndRenamed());
 
     ClassSubject impl = inspector.clazz(implClassName);
     assertThat(impl, isPresent());
-    assertThat(impl, not(isRenamed()));
+    assertThat(impl, isPresentAndNotRenamed());
     // API entry is kept, hence the presence of Metadata.
     KmClassSubject kmClass = impl.getKmClass();
     assertThat(kmClass, isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
index 2c14c8d..ac4085f 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
@@ -6,11 +6,11 @@
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isDexClass;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertNotNull;
 import static junit.framework.TestCase.assertTrue;
-import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestParameters;
@@ -168,15 +168,13 @@
     String libKtClassName = packageName + ".LibKt";
 
     ClassSubject itf = inspector.clazz(itfClassName);
-    assertThat(itf, isRenamed());
+    assertThat(itf, isPresentAndRenamed());
 
     ClassSubject libKt = inspector.clazz(libKtClassName);
-    assertThat(libKt, isPresent());
-    assertThat(libKt, not(isRenamed()));
+    assertThat(libKt, isPresentAndNotRenamed());
 
     MethodSubject seq = libKt.uniqueMethodWithName("seq");
-    assertThat(seq, isPresent());
-    assertThat(seq, not(isRenamed()));
+    assertThat(seq, isPresentAndNotRenamed());
 
     // API entry is kept, hence the presence of Metadata.
     KmPackageSubject kmPackage = libKt.getKmPackage();
@@ -219,7 +217,7 @@
 
     // Check that Arr has been renamed.
     ClassSubject arr = inspector.clazz(packageName + ".Arr");
-    assertThat(arr, isRenamed());
+    assertThat(arr, isPresentAndRenamed());
 
     ClassSubject libKt = inspector.clazz(libKtClassName);
     KmPackageSubject kmPackage = libKt.getKmPackage();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeArgumentsTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeArgumentsTest.java
index df35c97..52ae0b3 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeArgumentsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeArgumentsTest.java
@@ -7,7 +7,7 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isDexClass;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isExtensionFunction;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -171,7 +171,7 @@
     assertThat(someClass, isPresent());
     ClassSubject classThatShouldBeObfuscated =
         inspector.clazz(LIB_PKG + "ClassThatWillBeObfuscated");
-    assertThat(classThatShouldBeObfuscated, isRenamed());
+    assertThat(classThatShouldBeObfuscated, isPresentAndRenamed());
 
     // Check that the type-parameters of Invariant is marked as INVARIANT.
     ClassSubject invariant = inspector.clazz(LIB_PKG + "Invariant");
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataStripTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataStripTest.java
index 043a48a..dec2ff2 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataStripTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataStripTest.java
@@ -4,7 +4,8 @@
 package com.android.tools.r8.kotlin.metadata;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -59,14 +60,12 @@
             .run(parameters.getRuntime(), mainClassName);
     CodeInspector inspector = result.inspector();
     ClassSubject clazz = inspector.clazz(mainClassName);
-    assertThat(clazz, isPresent());
-    assertThat(clazz, not(isRenamed()));
+    assertThat(clazz, isPresentAndNotRenamed());
     // Main class is kept, hence the presence of Metadata.
     AnnotationSubject annotationSubject = clazz.annotation(METADATA_TYPE);
     assertThat(annotationSubject, isPresent());
     ClassSubject impl1 = inspector.clazz(implementer1ClassName);
-    assertThat(impl1, isPresent());
-    assertThat(impl1, isRenamed());
+    assertThat(impl1, isPresentAndRenamed());
     // All other classes can be renamed, hence the absence of Metadata;
     assertThat(impl1.annotation(METADATA_TYPE), not(isPresent()));
   }
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListOutputTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListOutputTest.java
index 123744d..447ed7e 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListOutputTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListOutputTest.java
@@ -4,32 +4,29 @@
 
 package com.android.tools.r8.maindexlist;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.DexIndexedConsumer.ArchiveConsumer;
-import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
 import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.StringConsumer.FileConsumer;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.StringDiagnostic;
 import com.google.common.collect.ImmutableList;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.util.stream.Collectors;
 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 MainDexListOutputTest extends TestBase {
 
   interface MyConsumer<T> {
@@ -67,50 +64,45 @@
     }
   }
 
-  class Reporter implements DiagnosticsHandler {
-    int errorCount = 0;
-
-    @Override
-    public void error(Diagnostic error) {
-      errorCount++;
-      assertTrue(error instanceof StringDiagnostic);
-      assertTrue(error.getDiagnosticMessage().contains("main-dex"));
-    }
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
   }
 
-  @Test
+  public MainDexListOutputTest(TestParameters parameters) {
+    parameters.assertNoneRuntime();
+  }
+
+  @Test(expected = CompilationFailedException.class)
   public void testNoMainDex() throws Exception {
-    Reporter reporter = new Reporter();
-    try {
-      Path mainDexListOutput = temp.getRoot().toPath().resolve("main-dex-output.txt");
-      R8Command.builder(reporter)
-          .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
-          .addClassProgramData(
-              ToolHelper.getClassAsBytes(HelloWorldMain.class), Origin.unknown())
-          .setMainDexListOutputPath(mainDexListOutput)
-          .build();
-      fail("Expect to fail");
-    } catch (CompilationFailedException e) {
-      assertEquals(1, reporter.errorCount);
-      assertThat(
-          e.getCause().getMessage(),
-          containsString("--main-dex-list-output require --main-dex-rules and/or --main-dex-list"));
-    }
+    Path mainDexListOutput = temp.getRoot().toPath().resolve("main-dex-output.txt");
+    testForR8(Backend.DEX)
+        .addProgramClasses(HelloWorldMain.class)
+        .setMainDexListConsumer(new FileConsumer(mainDexListOutput))
+        .setMinApi(AndroidApiLevel.K)
+        .compileWithExpectedDiagnostics(
+            diagnostics ->
+                diagnostics
+                    .assertOnlyErrors()
+                    .assertErrorsMatch(
+                        diagnosticMessage(
+                            containsString(
+                                "--main-dex-list-output require --main-dex-rules and/or"
+                                    + " --main-dex-list"))));
   }
 
   @Test
   public void testWithMainDex() throws Exception {
     Path mainDexRules = writeTextToTempFile(keepMainProguardConfiguration(HelloWorldMain.class));
     Path mainDexListOutput = temp.getRoot().toPath().resolve("main-dex-output.txt");
-    R8Command command =
-        ToolHelper.prepareR8CommandBuilder(readClasses(HelloWorldMain.class))
-            .setDisableTreeShaking(true)
-            .setDisableMinification(true)
-            .addMainDexRulesFiles(mainDexRules)
-            .setMainDexListOutputPath(mainDexListOutput)
-            .setOutput(temp.getRoot().toPath(), OutputMode.DexIndexed)
-            .build();
-    ToolHelper.runR8(command);
+    testForR8(Backend.DEX)
+        .addProgramClasses(HelloWorldMain.class)
+        .noTreeShaking()
+        .noMinification()
+        .setMinApi(AndroidApiLevel.K)
+        .addMainDexRuleFiles(mainDexRules)
+        .setMainDexListConsumer(new FileConsumer(mainDexListOutput))
+        .compile();
     // Main dex list with the single class.
     assertEquals(
         ImmutableList.of(HelloWorldMain.class.getTypeName().replace('.', '/') + ".class"),
@@ -121,7 +113,7 @@
   }
 
   @Test
-  public void testD8DesugaredLambdasInMainDexList() throws IOException, CompilationFailedException {
+  public void testD8DesugaredLambdasInMainDexList() throws Exception {
     Path mainDexList = writeTextToTempFile(testClassMainDexName);
     TestMainDexListConsumer consumer = new TestMainDexListConsumer();
     testForD8()
@@ -134,17 +126,16 @@
   }
 
   @Test
-  public void testD8DesugaredLambdasInMainDexListMerging()
-      throws IOException, CompilationFailedException {
+  public void testD8DesugaredLambdasInMainDexListMerging() throws Exception {
     Path mainDexList = writeTextToTempFile(testClassMainDexName);
-    Path dexOutput = temp.getRoot().toPath().resolve("classes.zip");
     // Build intermediate dex code first.
-    testForD8()
-        .setMinApi(AndroidApiLevel.K)
-        .addProgramClasses(ImmutableList.of(TestClass.class, MyConsumer.class))
-        .setIntermediate(true)
-        .setProgramConsumer(new ArchiveConsumer(dexOutput))
-        .compile();
+    Path dexOutput =
+        testForD8()
+            .setMinApi(AndroidApiLevel.K)
+            .addProgramClasses(ImmutableList.of(TestClass.class, MyConsumer.class))
+            .setIntermediate(true)
+            .compile()
+            .writeToZip();
     // Now test that when merging with a main dex list it is correctly updated.
     TestMainDexListConsumer consumer = new TestMainDexListConsumer();
     testForD8()
diff --git a/src/test/java/com/android/tools/r8/naming/AbstractMethodRenamingTest.java b/src/test/java/com/android/tools/r8/naming/AbstractMethodRenamingTest.java
index 71b158d..9f44e4b 100644
--- a/src/test/java/com/android/tools/r8/naming/AbstractMethodRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/AbstractMethodRenamingTest.java
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -81,26 +80,20 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject base = inspector.clazz(Base.class);
-    assertThat(base, isPresent());
-    assertThat(base, isRenamed());
+    assertThat(base, isPresentAndRenamed());
     MethodSubject foo = base.uniqueMethodWithName("foo");
-    assertThat(foo, isPresent());
-    assertThat(foo, isRenamed());
+    assertThat(foo, isPresentAndRenamed());
 
     ClassSubject sub1 = inspector.clazz(Sub1.class);
-    assertThat(sub1, isPresent());
-    assertThat(sub1, isRenamed());
+    assertThat(sub1, isPresentAndRenamed());
     MethodSubject fooInSub1 = sub1.uniqueMethodWithName("foo");
-    assertThat(fooInSub1, isPresent());
-    assertThat(fooInSub1, isRenamed());
+    assertThat(fooInSub1, isPresentAndRenamed());
     assertEquals(foo.getFinalName(), fooInSub1.getFinalName());
 
     ClassSubject sub2 = inspector.clazz(Sub1.class);
-    assertThat(sub2, isPresent());
-    assertThat(sub2, isRenamed());
+    assertThat(sub2, isPresentAndRenamed());
     MethodSubject fooInSub2 = sub2.uniqueMethodWithName("foo");
-    assertThat(fooInSub2, isPresent());
-    assertThat(fooInSub2, isRenamed());
+    assertThat(fooInSub2, isPresentAndRenamed());
     assertEquals(foo.getFinalName(), fooInSub2.getFinalName());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/AbstractR8KotlinNamingTestBase.java b/src/test/java/com/android/tools/r8/naming/AbstractR8KotlinNamingTestBase.java
index 2815aed..9f2d940 100644
--- a/src/test/java/com/android/tools/r8/naming/AbstractR8KotlinNamingTestBase.java
+++ b/src/test/java/com/android/tools/r8/naming/AbstractR8KotlinNamingTestBase.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
@@ -29,65 +29,65 @@
 
   protected ClassSubject checkClassIsRenamed(CodeInspector inspector, String className) {
     ClassSubject classSubject = inspector.clazz(className);
-    assertThat(classSubject, isRenamed());
+    assertThat(classSubject, isPresentAndRenamed());
     return classSubject;
   }
 
   protected ClassSubject checkClassIsNotRenamed(CodeInspector inspector, String className) {
     ClassSubject classSubject = inspector.clazz(className);
-    assertThat(classSubject, not(isRenamed()));
+    assertThat(classSubject, isPresentAndNotRenamed());
     return classSubject;
   }
 
   protected FieldSubject checkFieldIsRenamed(
       ClassSubject classSubject, String fieldType, String fieldName) {
     FieldSubject fieldSubject = checkFieldIsKept(classSubject, fieldType, fieldName);
-    assertThat(fieldSubject, isRenamed());
+    assertThat(fieldSubject, isPresentAndRenamed());
     return fieldSubject;
   }
 
   protected FieldSubject checkFieldIsRenamed(ClassSubject classSubject, String fieldName) {
     FieldSubject fieldSubject = checkFieldIsKept(classSubject, fieldName);
-    assertThat(fieldSubject, isRenamed());
+    assertThat(fieldSubject, isPresentAndRenamed());
     return fieldSubject;
   }
 
   protected FieldSubject checkFieldIsNotRenamed(
       ClassSubject classSubject, String fieldType, String fieldName) {
     FieldSubject fieldSubject = checkFieldIsKept(classSubject, fieldType, fieldName);
-    assertThat(fieldSubject, not(isRenamed()));
+    assertThat(fieldSubject, isPresentAndNotRenamed());
     return fieldSubject;
   }
 
   protected FieldSubject checkFieldIsNotRenamed(ClassSubject classSubject, String fieldName) {
     FieldSubject fieldSubject = checkFieldIsKept(classSubject, fieldName);
-    assertThat(fieldSubject, not(isRenamed()));
+    assertThat(fieldSubject, isPresentAndNotRenamed());
     return fieldSubject;
   }
 
   protected MethodSubject checkMethodIsRenamed(
       ClassSubject classSubject, MethodSignature methodSignature) {
     MethodSubject methodSubject = checkMethodIsKept(classSubject, methodSignature);
-    assertThat(methodSubject, isRenamed());
+    assertThat(methodSubject, isPresentAndRenamed());
     return methodSubject;
   }
 
   protected MethodSubject checkMethodIsRenamed(ClassSubject classSubject, String methodName) {
     MethodSubject methodSubject = checkMethodIsKept(classSubject, methodName);
-    assertThat(methodSubject, isRenamed());
+    assertThat(methodSubject, isPresentAndRenamed());
     return methodSubject;
   }
 
   protected MethodSubject checkMethodIsNotRenamed(
       ClassSubject classSubject, MethodSignature methodSignature) {
     MethodSubject methodSubject = checkMethodIsKept(classSubject, methodSignature);
-    assertThat(methodSubject, not(isRenamed()));
+    assertThat(methodSubject, isPresentAndNotRenamed());
     return methodSubject;
   }
 
   protected MethodSubject checkMethodIsNotRenamed(ClassSubject classSubject, String methodName) {
     MethodSubject methodSubject = checkMethodIsKept(classSubject, methodName);
-    assertThat(methodSubject, not(isRenamed()));
+    assertThat(methodSubject, isPresentAndNotRenamed());
     return methodSubject;
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/AvoidRTest.java b/src/test/java/com/android/tools/r8/naming/AvoidRTest.java
index 5c2d882..8feb257 100644
--- a/src/test/java/com/android/tools/r8/naming/AvoidRTest.java
+++ b/src/test/java/com/android/tools/r8/naming/AvoidRTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.DescriptorUtils.getUnqualifiedClassNameFromDescriptor;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
@@ -60,19 +60,23 @@
     }
     builder.addProgramClassFileData(jasminBuilder.buildClasses());
     Set<String> usedDescriptors = new HashSet<>();
-    builder.noTreeShaking()
+    builder
+        .noTreeShaking()
         .addKeepRules("-classobfuscationdictionary " + dictionary)
         .compile()
-        .inspect(codeInspector -> {
-          codeInspector.forAllClasses(classSubject -> {
-            assertThat(classSubject, isRenamed());
-            String renamedDescriptor = classSubject.getFinalDescriptor();
-            assertTrue(usedDescriptors.add(renamedDescriptor));
-            assertNotEquals("R", getUnqualifiedClassNameFromDescriptor(renamedDescriptor));
-            assertTrue(expectedNames.contains(
-                getUnqualifiedClassNameFromDescriptor(renamedDescriptor)));
-          });
-        });
+        .inspect(
+            codeInspector -> {
+              codeInspector.forAllClasses(
+                  classSubject -> {
+                    assertThat(classSubject, isPresentAndRenamed());
+                    String renamedDescriptor = classSubject.getFinalDescriptor();
+                    assertTrue(usedDescriptors.add(renamedDescriptor));
+                    assertNotEquals("R", getUnqualifiedClassNameFromDescriptor(renamedDescriptor));
+                    assertTrue(
+                        expectedNames.contains(
+                            getUnqualifiedClassNameFromDescriptor(renamedDescriptor)));
+                  });
+            });
   }
 
   @Test
@@ -84,15 +88,18 @@
     }
     builder.addProgramClassFileData(jasminBuilder.buildClasses());
     Set<String> usedNames = new HashSet<>();
-    builder.noTreeShaking()
+    builder
+        .noTreeShaking()
         .compile()
-        .inspect(codeInspector -> {
-          codeInspector.forAllClasses(classSubject -> {
-            assertThat(classSubject, isRenamed());
-            assertTrue(usedNames.add(classSubject.getFinalName()));
-            assertNotEquals("R", classSubject.getFinalName());
-          });
-        });
+        .inspect(
+            codeInspector -> {
+              codeInspector.forAllClasses(
+                  classSubject -> {
+                    assertThat(classSubject, isPresentAndRenamed());
+                    assertTrue(usedNames.add(classSubject.getFinalName()));
+                    assertNotEquals("R", classSubject.getFinalName());
+                  });
+            });
     assertTrue(usedNames.contains("Q"));
     assertTrue(usedNames.contains("S"));
   }
@@ -114,17 +121,20 @@
     }
     builder.addProgramClassFileData(jasminBuilder.buildClasses());
     Set<String> usedDescriptors = new HashSet<>();
-    builder.noTreeShaking()
+    builder
+        .noTreeShaking()
         .addKeepRules(keepRule)
         .compile()
-        .inspect(codeInspector -> {
-          codeInspector.forAllClasses(classSubject -> {
-            assertThat(classSubject, isRenamed());
-            String renamedDescriptor = classSubject.getFinalDescriptor();
-            assertTrue(usedDescriptors.add(renamedDescriptor));
-            assertNotEquals("R", getUnqualifiedClassNameFromDescriptor(renamedDescriptor));
-          });
-        });
+        .inspect(
+            codeInspector -> {
+              codeInspector.forAllClasses(
+                  classSubject -> {
+                    assertThat(classSubject, isPresentAndRenamed());
+                    String renamedDescriptor = classSubject.getFinalDescriptor();
+                    assertTrue(usedDescriptors.add(renamedDescriptor));
+                    assertNotEquals("R", getUnqualifiedClassNameFromDescriptor(renamedDescriptor));
+                  });
+            });
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/naming/ClassNameMinifierOriginalClassNameTest.java b/src/test/java/com/android/tools/r8/naming/ClassNameMinifierOriginalClassNameTest.java
index 553fe0c..779eb8a 100644
--- a/src/test/java/com/android/tools/r8/naming/ClassNameMinifierOriginalClassNameTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ClassNameMinifierOriginalClassNameTest.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -62,7 +62,7 @@
         .inspect(
             inspector -> {
               assertEquals(1, inspector.allClasses().size());
-              assertThat(inspector.clazz(B.class), isRenamed());
+              assertThat(inspector.clazz(B.class), isPresentAndRenamed());
               assertEquals(A.class.getTypeName(), inspector.clazz(B.class).getFinalName());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeInSubInterfaceTest.java b/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeInSubInterfaceTest.java
index 8c50aa7..3eae470 100644
--- a/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeInSubInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeInSubInterfaceTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
@@ -94,13 +94,13 @@
   private void inspect(CodeInspector inspector, boolean overloadAggressively)
       throws NoSuchMethodException {
     ClassSubject superInterface = inspector.clazz(SuperInterface.class);
-    assertThat(superInterface, isRenamed());
+    assertThat(superInterface, isPresentAndRenamed());
     MethodSubject foo1 = superInterface.uniqueMethodWithName("foo");
-    assertThat(foo1, isRenamed());
+    assertThat(foo1, isPresentAndRenamed());
     ClassSubject subInterface = inspector.clazz(SubInterface.class);
-    assertThat(subInterface, isRenamed());
+    assertThat(subInterface, isPresentAndRenamed());
     MethodSubject foo2 = subInterface.method(SubInterface.class.getDeclaredMethod("foo"));
-    assertThat(foo2, isRenamed());
+    assertThat(foo2, isPresentAndRenamed());
     if (overloadAggressively && parameters.isDexRuntime()) {
       assertNotEquals(foo1.getFinalName(), foo2.getFinalName());
     } else {
diff --git a/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeTest.java b/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeTest.java
index 6cb9837..5d11b24 100644
--- a/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeTest.java
+++ b/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeTest.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -83,7 +83,7 @@
     Set<String> minifiedMethodNames = new HashSet<>();
     for (Set<MethodSubject> methodSubjects : methodSubjectsByName.values()) {
       for (MethodSubject methodSubject : methodSubjects) {
-        assertThat(methodSubject, isRenamed());
+        assertThat(methodSubject, isPresentAndRenamed());
         minifiedMethodNames.add(methodSubject.getFinalName());
       }
     }
diff --git a/src/test/java/com/android/tools/r8/naming/EnumMinification.java b/src/test/java/com/android/tools/r8/naming/EnumMinification.java
index 177a7f0..6a5ff3e 100644
--- a/src/test/java/com/android/tools/r8/naming/EnumMinification.java
+++ b/src/test/java/com/android/tools/r8/naming/EnumMinification.java
@@ -5,7 +5,8 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 
@@ -65,12 +66,14 @@
     ClassSubject clazz = inspector.clazz(enumTypeName);
     // The class and fields - including field $VALUES and method valueOf - can be renamed. Only
     // the values() method needs to be
-    assertThat(clazz, isRenamed());
-    assertThat(clazz.uniqueFieldWithName("VALUE1"), isRenamed());
-    assertThat(clazz.uniqueFieldWithName("VALUE2"), isRenamed());
-    assertThat(clazz.uniqueFieldWithName("$VALUES"), isRenamed());
-    assertThat(clazz.uniqueMethodWithName("valueOf"), valueOfKept ? isRenamed() : not(isPresent()));
-    assertThat(clazz.uniqueMethodWithName("values"), not(isRenamed()));
+    assertThat(clazz, isPresentAndRenamed());
+    assertThat(clazz.uniqueFieldWithName("VALUE1"), isPresentAndRenamed());
+    assertThat(clazz.uniqueFieldWithName("VALUE2"), isPresentAndRenamed());
+    assertThat(clazz.uniqueFieldWithName("$VALUES"), isPresentAndRenamed());
+    assertThat(
+        clazz.uniqueMethodWithName("valueOf"),
+        valueOfKept ? isPresentAndRenamed() : not(isPresent()));
+    assertThat(clazz.uniqueMethodWithName("values"), isPresentAndNotRenamed());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/naming/ForNameRenamingTest.java b/src/test/java/com/android/tools/r8/naming/ForNameRenamingTest.java
index 1d776b5..c69ecd0 100644
--- a/src/test/java/com/android/tools/r8/naming/ForNameRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ForNameRenamingTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -48,8 +48,7 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject boo = inspector.clazz(Boo.class);
-    assertThat(boo, isPresent());
-    assertThat(boo, isRenamed());
+    assertThat(boo, isPresentAndRenamed());
 
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
diff --git a/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java b/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
index 5eca4d1..f72abf5 100644
--- a/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
+++ b/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
@@ -4,8 +4,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.DescriptorUtils.getPackageNameFromDescriptor;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -44,15 +43,13 @@
 
     public void inspect(CodeInspector inspector) {
       ClassSubject top = inspector.clazz(Top.class);
-      assertThat(top, isPresent());
-      assertThat(top, isRenamed());
+      assertThat(top, isPresentAndRenamed());
       assertEquals(
           getPackageNameFromDescriptor(top.getOriginalDescriptor()),
           getPackageNameFromDescriptor(top.getFinalDescriptor()));
 
       ClassSubject sub = inspector.clazz(SubClass.class);
-      assertThat(sub, isPresent());
-      assertThat(sub, isRenamed());
+      assertThat(sub, isPresentAndRenamed());
       switch (this) {
         case SINGLE_ASTERISK:
           assertNotEquals(
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
index bcb02da..07dad43 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -327,13 +327,13 @@
                     .setProguardMapConsumer(StringConsumer.emptyConsumer())
                     .build()));
     // All classes are kept, and renamed.
-    assertThat(inspector.clazz("Simple"), isRenamed());
-    assertThat(inspector.clazz("Base"), isRenamed());
-    assertThat(inspector.clazz("Outer"), isRenamed());
-    assertThat(inspector.clazz("Outer$Inner"), isRenamed());
-    assertThat(inspector.clazz("Outer$ExtendsInner"), isRenamed());
-    assertThat(inspector.clazz("Outer$Inner$InnerInner"), isRenamed());
-    assertThat(inspector.clazz("Outer$Inner$ExtendsInnerInner"), isRenamed());
+    assertThat(inspector.clazz("Simple"), isPresentAndRenamed());
+    assertThat(inspector.clazz("Base"), isPresentAndRenamed());
+    assertThat(inspector.clazz("Outer"), isPresentAndRenamed());
+    assertThat(inspector.clazz("Outer$Inner"), isPresentAndRenamed());
+    assertThat(inspector.clazz("Outer$ExtendsInner"), isPresentAndRenamed());
+    assertThat(inspector.clazz("Outer$Inner$InnerInner"), isPresentAndRenamed());
+    assertThat(inspector.clazz("Outer$Inner$ExtendsInnerInner"), isPresentAndRenamed());
 
     // Test that classes with have their original signature if the default was provided.
     if (!signatures.containsKey("Simple")) {
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
index 5737496..12b18e4 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -193,8 +193,8 @@
                     .build()));
     // All classes are kept, and renamed.
     ClassSubject clazz = inspector.clazz("Fields");
-    assertThat(clazz, isRenamed());
-    assertThat(inspector.clazz("Fields$Inner"), isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
+    assertThat(inspector.clazz("Fields$Inner"), isPresentAndRenamed());
 
     FieldSubject anX = lookupAnX(inspector);
     FieldSubject anArrayOfX = lookupAnArrayOfX(inspector);
@@ -202,10 +202,10 @@
     FieldSubject aFieldsOfXInner = clazz.field("Fields$Inner", "aFieldsOfXInner");
 
     // Check that all fields have been renamed
-    assertThat(anX, isRenamed());
-    assertThat(anArrayOfX, isRenamed());
-    assertThat(aFieldsOfX, isRenamed());
-    assertThat(aFieldsOfXInner, isRenamed());
+    assertThat(anX, isPresentAndRenamed());
+    assertThat(anArrayOfX, isPresentAndRenamed());
+    assertThat(aFieldsOfX, isPresentAndRenamed());
+    assertThat(aFieldsOfXInner, isPresentAndRenamed());
 
     //System.out.println(generic.getFinalSignatureAttribute());
     //System.out.println(generic.getOriginalSignatureAttribute());
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
index b19ed16..a275bdb 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -215,8 +215,8 @@
                     .build()));
     // All classes are kept, and renamed.
     ClassSubject clazz = inspector.clazz("Methods");
-    assertThat(clazz, isRenamed());
-    assertThat(inspector.clazz("Methods$Inner"), isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
+    assertThat(inspector.clazz("Methods$Inner"), isPresentAndRenamed());
 
     MethodSubject generic = lookupGeneric(inspector);
     MethodSubject parameterizedReturn = lookupParameterizedReturn(inspector);
@@ -225,10 +225,10 @@
         clazz.method("void", "parametrizedThrows", ImmutableList.of());
 
     // Check that all methods have been renamed
-    assertThat(generic, isRenamed());
-    assertThat(parameterizedReturn, isRenamed());
-    assertThat(parameterizedArguments, isRenamed());
-    assertThat(parametrizedThrows, isRenamed());
+    assertThat(generic, isPresentAndRenamed());
+    assertThat(parameterizedReturn, isPresentAndRenamed());
+    assertThat(parameterizedArguments, isPresentAndRenamed());
+    assertThat(parametrizedThrows, isPresentAndRenamed());
 
     // Test that methods have their original signature if the default was provided.
     if (!signatures.containsKey("generic")) {
diff --git a/src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java b/src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java
index 18bc136..11c9154 100644
--- a/src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java
@@ -5,8 +5,7 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -59,8 +58,7 @@
     assertThat(classSubject, isPresent());
 
     FieldSubject fieldSubject = classSubject.uniqueFieldWithName("a");
-    assertThat(fieldSubject, isPresent());
-    assertThat(fieldSubject, not(isRenamed()));
+    assertThat(fieldSubject, isPresentAndNotRenamed());
 
     FieldSubject helloFieldSubject = classSubject.uniqueFieldWithName("hello");
     assertThat(helloFieldSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
index 943e4bf..67b86ce 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
@@ -4,8 +4,8 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -102,40 +102,40 @@
     assertThat(aFieldSubject, isPresent());
 
     if (reserveName) {
-      assertThat(f1FieldSubject, isRenamed());
+      assertThat(f1FieldSubject, isPresentAndRenamed());
       assertEquals("e", f1FieldSubject.getFinalName());
 
-      assertThat(f2FieldSubject, isRenamed());
+      assertThat(f2FieldSubject, isPresentAndRenamed());
       assertEquals("f", f2FieldSubject.getFinalName());
 
-      assertThat(f3FieldSubject, isRenamed());
+      assertThat(f3FieldSubject, isPresentAndRenamed());
       assertEquals("b", f3FieldSubject.getFinalName());
 
-      assertThat(f4FieldSubject, isRenamed());
+      assertThat(f4FieldSubject, isPresentAndRenamed());
       assertEquals("c", f4FieldSubject.getFinalName());
 
-      assertThat(f5FieldSubject, isRenamed());
+      assertThat(f5FieldSubject, isPresentAndRenamed());
       assertEquals("d", f5FieldSubject.getFinalName());
 
       // B.a should not be renamed because it is not allowed to be minified.
-      assertThat(aFieldSubject, not(isRenamed()));
+      assertThat(aFieldSubject, isPresentAndNotRenamed());
     } else {
-      assertThat(f1FieldSubject, isRenamed());
+      assertThat(f1FieldSubject, isPresentAndRenamed());
       assertEquals("d", f1FieldSubject.getFinalName());
 
-      assertThat(f2FieldSubject, isRenamed());
+      assertThat(f2FieldSubject, isPresentAndRenamed());
       assertEquals("e", f2FieldSubject.getFinalName());
 
-      assertThat(f3FieldSubject, isRenamed());
+      assertThat(f3FieldSubject, isPresentAndRenamed());
       assertEquals("a", f3FieldSubject.getFinalName());
 
-      assertThat(f4FieldSubject, isRenamed());
+      assertThat(f4FieldSubject, isPresentAndRenamed());
       assertEquals("b", f4FieldSubject.getFinalName());
 
-      assertThat(f5FieldSubject, isRenamed());
+      assertThat(f5FieldSubject, isPresentAndRenamed());
       assertEquals("c", f5FieldSubject.getFinalName());
 
-      assertThat(aFieldSubject, isRenamed());
+      assertThat(aFieldSubject, isPresentAndRenamed());
       assertEquals("f", aFieldSubject.getFinalName());
     }
   }
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
index 309c156..89804e8 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
@@ -4,8 +4,8 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeFalse;
@@ -69,13 +69,13 @@
 
     FieldSubject f1FieldSubject = iClassSubject.uniqueFieldWithName("f1");
     assertThat(f1FieldSubject, isPresent());
-    assertThat(f1FieldSubject, isRenamed());
+    assertThat(f1FieldSubject, isPresentAndRenamed());
 
     FieldSubject aFieldSubject = jClassSubject.uniqueFieldWithName("a");
     assertThat(aFieldSubject, isPresent());
 
     if (reserveName) {
-      assertThat(aFieldSubject, not(isRenamed()));
+      assertThat(aFieldSubject, isPresentAndNotRenamed());
 
       // Interface fields are visited/renamed before fields on classes. Thus, the interface field
       // I.f1 will be visited first and assigned the name b (since the name a is reserved).
@@ -88,7 +88,7 @@
 
       // The interface field J.a will be visited after I.f1, and will therefore be assigned the name
       // b.
-      assertThat(aFieldSubject, isRenamed());
+      assertThat(aFieldSubject, isPresentAndRenamed());
       assertEquals("b", aFieldSubject.getFinalName());
     }
 
@@ -121,7 +121,7 @@
 
     FieldSubject f2FieldSubject = aClassSubject.uniqueFieldWithName("f2");
     assertThat(f2FieldSubject, isPresent());
-    assertThat(f2FieldSubject, isRenamed());
+    assertThat(f2FieldSubject, isPresentAndRenamed());
 
     assertEquals(expectedNameForF2, f2FieldSubject.getFinalName());
   }
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java
index c687947..e7f32e3 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java
@@ -4,8 +4,8 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
@@ -63,7 +63,7 @@
     // Fields are visited/renamed according to the class hierarchy order. Thus, the field A.a will
     // be visited first and assigned the name a. As it ends up receiving the same name as in the
     // original program, it has not technically been renamed.
-    assertThat(aFieldSubject, not(isRenamed()));
+    assertThat(aFieldSubject, isPresentAndNotRenamed());
 
     inspect(inspector);
   }
@@ -90,16 +90,14 @@
     assertThat(aSub1ClassSubject, isPresent());
 
     FieldSubject fooFieldSubject = aSub1ClassSubject.uniqueFieldWithName("foo");
-    assertThat(fooFieldSubject, isPresent());
-    assertThat(fooFieldSubject, isRenamed());
+    assertThat(fooFieldSubject, isPresentAndRenamed());
     assertNotEquals("a", fooFieldSubject.getFinalName());
 
     ClassSubject aSub2ClassSubject = inspector.clazz(ASub2.class);
     assertThat(aSub2ClassSubject, isPresent());
 
     FieldSubject barFieldSubject = aSub2ClassSubject.uniqueFieldWithName("bar");
-    assertThat(barFieldSubject, isPresent());
-    assertThat(barFieldSubject, isRenamed());
+    assertThat(barFieldSubject, isPresentAndRenamed());
     assertNotEquals("a", barFieldSubject.getFinalName());
 
     // Verify that ASub1.foo and ASub2.bar has been renamed to the same name.
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
index 4af8655..599799e 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
@@ -4,8 +4,8 @@
 package com.android.tools.r8.naming;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeFalse;
@@ -66,7 +66,7 @@
     // Interface fields are visited/renamed before fields on classes. Thus, the interface field I.a
     // will be visited first and assigned the name a. As it ends up receiving the same name as in
     // the input program, it has not technically been renamed.
-    assertThat(aFieldSubject, not(isRenamed()));
+    assertThat(aFieldSubject, isPresentAndNotRenamed());
 
     inspect(inspector);
   }
@@ -95,7 +95,7 @@
 
     FieldSubject f1FieldSubject = jClassSubject.uniqueFieldWithName("f1");
     assertThat(f1FieldSubject, isPresent());
-    assertThat(f1FieldSubject, isRenamed());
+    assertThat(f1FieldSubject, isPresentAndRenamed());
     assertEquals("b", f1FieldSubject.getFinalName());
 
     ClassSubject aClassSubject = inspector.clazz(A.class);
@@ -103,7 +103,7 @@
 
     FieldSubject f2FieldSubject = aClassSubject.uniqueFieldWithName("f2");
     assertThat(f2FieldSubject, isPresent());
-    assertThat(f2FieldSubject, isRenamed());
+    assertThat(f2FieldSubject, isPresentAndRenamed());
     assertEquals("c", f2FieldSubject.getFinalName());
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingDesugarLambdaTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingDesugarLambdaTest.java
index e0d117f..0d0af87 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingDesugarLambdaTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingDesugarLambdaTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming.applymapping;
 
 import static com.android.tools.r8.Collectors.toSingle;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertNotSame;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -58,7 +58,7 @@
             .compile()
             .inspect(
                 inspector -> {
-                  assertThat(inspector.clazz(A.class), isRenamed());
+                  assertThat(inspector.clazz(A.class), isPresentAndRenamed());
                   assertEquals(finalName, inspector.clazz(A.class).getFinalName());
                 });
 
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionAsmTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionAsmTest.java
index 837c7df..1d188fb 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionAsmTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionAsmTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming.applymapping.sourcelibrary;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -113,18 +113,15 @@
             .inspector();
 
     ClassSubject base = codeInspector.clazz("HasMapping");
-    assertThat(base, isPresent());
-    assertThat(base, isRenamed());
+    assertThat(base, isPresentAndRenamed());
     assertEquals("X", base.getFinalName());
     MethodSubject x = base.method("void", "foo", ImmutableList.of());
-    assertThat(x, isPresent());
-    assertThat(x, isRenamed());
+    assertThat(x, isPresentAndRenamed());
     assertEquals("a", x.getFinalName());
 
     // To ensure still getting illegal-access error we need to rename consistently.
     ClassSubject sub = codeInspector.clazz("NoMapping");
-    assertThat(sub, isPresent());
-    assertThat(sub, isRenamed());
+    assertThat(sub, isPresentAndRenamed());
     assertEquals("Y", sub.getFinalName());
     MethodSubject y = sub.method("void", "a", ImmutableList.of());
     assertThat(y, isPresent());
@@ -212,17 +209,14 @@
 
     CodeInspector codeInspector = compileResult.inspector();
     ClassSubject base = codeInspector.clazz("A");
-    assertThat(base, isPresent());
-    assertThat(base, isRenamed());
+    assertThat(base, isPresentAndRenamed());
     assertEquals("X", base.getFinalName());
     MethodSubject x = base.method("void", "x", ImmutableList.of());
-    assertThat(x, isPresent());
-    assertThat(x, isRenamed());
+    assertThat(x, isPresentAndRenamed());
     assertEquals("y", x.getFinalName());
 
     ClassSubject sub = codeInspector.clazz("B");
-    assertThat(sub, isPresent());
-    assertThat(sub, isRenamed());
+    assertThat(sub, isPresentAndRenamed());
     assertEquals("Y", sub.getFinalName());
     MethodSubject subX = sub.method("void", "x", ImmutableList.of());
     assertThat(subX, not(isPresent()));
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java
index 3b683fa..725c5a9 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming.applymapping.sourcelibrary;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -133,23 +133,19 @@
     ClassSubject base = inspector.clazz(AbstractChecker.class);
     assertThat(base, isPresent());
     FieldSubject p = base.field("java.lang.String", "tag");
-    assertThat(p, isPresent());
-    assertThat(p, isRenamed());
+    assertThat(p, isPresentAndRenamed());
     assertEquals("p", p.getFinalName());
     MethodSubject x = base.method("void", "check", ImmutableList.of());
-    assertThat(x, isPresent());
-    assertThat(x, isRenamed());
+    assertThat(x, isPresentAndRenamed());
     assertEquals("x", x.getFinalName());
 
     ClassSubject sub = inspector.clazz(ConcreteChecker.class);
     assertThat(sub, isPresent());
     FieldSubject q = sub.field("java.lang.String", "tag");
-    assertThat(q, isPresent());
-    assertThat(q, isRenamed());
+    assertThat(q, isPresentAndRenamed());
     assertEquals("q", q.getFinalName());
     MethodSubject y = sub.method("void", "check", ImmutableList.of());
-    assertThat(y, isPresent());
-    assertThat(y, isRenamed());
+    assertThat(y, isPresentAndRenamed());
     assertEquals("y", y.getFinalName());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/b116840216/ReserveOuterClassNameTest.java b/src/test/java/com/android/tools/r8/naming/b116840216/ReserveOuterClassNameTest.java
index d138e1b..5da3af5 100644
--- a/src/test/java/com/android/tools/r8/naming/b116840216/ReserveOuterClassNameTest.java
+++ b/src/test/java/com/android/tools/r8/naming/b116840216/ReserveOuterClassNameTest.java
@@ -3,9 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming.b116840216;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.CompatProguardCommandBuilder;
@@ -89,25 +88,19 @@
 
     CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject mainSubject = inspector.clazz(mainClass);
-    assertThat(mainSubject, isPresent());
-    assertThat(mainSubject, not(isRenamed()));
+    assertThat(mainSubject, isPresentAndNotRenamed());
     MethodSubject mainMethod = mainSubject.mainMethod();
-    assertThat(mainMethod, isPresent());
-    assertThat(mainMethod, not(isRenamed()));
+    assertThat(mainMethod, isPresentAndNotRenamed());
 
     ClassSubject outer = inspector.clazz(Outer.class);
-    assertThat(outer, isPresent());
-    assertThat(outer, not(isRenamed()));
+    assertThat(outer, isPresentAndNotRenamed());
     MethodSubject bar = outer.method("void", "bar", ImmutableList.of());
-    assertThat(bar, isPresent());
-    assertThat(bar, isRenamed());
+    assertThat(bar, isPresentAndRenamed());
 
     ClassSubject inner = inspector.clazz(Outer.Inner.class);
-    assertThat(inner, isPresent());
-    assertThat(inner, not(isRenamed()));
+    assertThat(inner, isPresentAndNotRenamed());
     MethodSubject foo = inner.method("void", "foo", ImmutableList.of());
-    assertThat(foo, isPresent());
-    assertThat(foo, isRenamed());
+    assertThat(foo, isPresentAndRenamed());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/naming/b124357885/B124357885Test.java b/src/test/java/com/android/tools/r8/naming/b124357885/B124357885Test.java
index e1cd05a..18d0719 100644
--- a/src/test/java/com/android/tools/r8/naming/b124357885/B124357885Test.java
+++ b/src/test/java/com/android/tools/r8/naming/b124357885/B124357885Test.java
@@ -4,9 +4,9 @@
 
 package com.android.tools.r8.naming.b124357885;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isNotRenamed;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -68,23 +68,25 @@
 
   @Test
   public void test() throws Exception {
-    R8TestCompileResult compileResult = testForR8(Backend.DEX)
-        .addProgramClasses(Main.class, Service.class, Foo.class, FooImpl.class)
-        .addKeepMainRule(Main.class)
-        .addKeepRules("-keepattributes Signature,InnerClasses,EnclosingMethod")
-        .minification(minification)
-        .compile()
-        .inspect(inspector -> {
-          assertThat(inspector.clazz(Main.class), isNotRenamed());
-          assertThat(inspector.clazz(Service.class), isRenamed(minification));
-          assertThat(inspector.clazz(Foo.class), not(isPresent()));
-          assertThat(inspector.clazz(FooImpl.class), isRenamed(minification));
-          // TODO(124477502): Using uniqueMethodWithName("fooList") does not work.
-          assertEquals(1, inspector.clazz(Service.class).allMethods().size());
-          MethodSubject fooList = inspector.clazz(Service.class).allMethods().get(0);
-          AnnotationSubject signature = fooList.annotation("dalvik.annotation.Signature");
-          checkSignatureAnnotation(inspector, signature);
-        });
+    R8TestCompileResult compileResult =
+        testForR8(Backend.DEX)
+            .addProgramClasses(Main.class, Service.class, Foo.class, FooImpl.class)
+            .addKeepMainRule(Main.class)
+            .addKeepRules("-keepattributes Signature,InnerClasses,EnclosingMethod")
+            .minification(minification)
+            .compile()
+            .inspect(
+                inspector -> {
+                  assertThat(inspector.clazz(Main.class), isPresentAndNotRenamed());
+                  assertThat(inspector.clazz(Service.class), isPresentAndRenamed(minification));
+                  assertThat(inspector.clazz(Foo.class), not(isPresent()));
+                  assertThat(inspector.clazz(FooImpl.class), isPresentAndRenamed(minification));
+                  // TODO(124477502): Using uniqueMethodWithName("fooList") does not work.
+                  assertEquals(1, inspector.clazz(Service.class).allMethods().size());
+                  MethodSubject fooList = inspector.clazz(Service.class).allMethods().get(0);
+                  AnnotationSubject signature = fooList.annotation("dalvik.annotation.Signature");
+                  checkSignatureAnnotation(inspector, signature);
+                });
 
         String fooImplFinalName = compileResult.inspector().clazz(FooImpl.class).getFinalName();
 
diff --git a/src/test/java/com/android/tools/r8/naming/b126592786/B126592786.java b/src/test/java/com/android/tools/r8/naming/b126592786/B126592786.java
index 2f909be..78f0d0c 100644
--- a/src/test/java/com/android/tools/r8/naming/b126592786/B126592786.java
+++ b/src/test/java/com/android/tools/r8/naming/b126592786/B126592786.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.naming.b126592786;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -55,19 +55,20 @@
             "}",
             "-keepattributes InnerClasses,EnclosingMethod,Signature ")
         .compile()
-        .inspect(inspector -> {
-            String genericTypeDescriptor = "Ljava/lang/Object;";
-            if (genericTypeLive) {
-              ClassSubject genericType = inspector.clazz(GenericType.class);
-              assertThat(genericType, isRenamed(minify));
-              genericTypeDescriptor = genericType.getFinalDescriptor();
-            }
-            String expectedSignature = "Ljava/util/List<" + genericTypeDescriptor + ">;";
-            FieldSubject list = inspector.clazz(A.class).uniqueFieldWithName("list");
-            assertThat(list, isPresent());
-            assertThat(list.getSignatureAnnotation(), isPresent());
-            assertEquals(expectedSignature, list.getSignatureAnnotationValue());
-        })
+        .inspect(
+            inspector -> {
+              String genericTypeDescriptor = "Ljava/lang/Object;";
+              if (genericTypeLive) {
+                ClassSubject genericType = inspector.clazz(GenericType.class);
+                assertThat(genericType, isPresentAndRenamed(minify));
+                genericTypeDescriptor = genericType.getFinalDescriptor();
+              }
+              String expectedSignature = "Ljava/util/List<" + genericTypeDescriptor + ">;";
+              FieldSubject list = inspector.clazz(A.class).uniqueFieldWithName("list");
+              assertThat(list, isPresent());
+              assertThat(list.getSignatureAnnotation(), isPresent());
+              assertEquals(expectedSignature, list.getSignatureAnnotationValue());
+            })
         .run(mainClass)
         .assertSuccess();
   }
diff --git a/src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java b/src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java
index f063f9e..56ed80c 100644
--- a/src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java
+++ b/src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming.b128656974;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNotEquals;
 
@@ -40,8 +40,7 @@
               ClassSubject greetingBase = inspector.clazz(Greeting.getGreetingBase());
               assertThat(greetingBase, isPresent());
               FieldSubject greeting = greetingBase.uniqueFieldWithName("greeting");
-              assertThat(greeting, isPresent());
-              assertThat(greeting, isRenamed());
+              assertThat(greeting, isPresentAndRenamed());
               assertNotEquals("a", greeting.getFinalName());
             });
   }
@@ -88,8 +87,7 @@
               ClassSubject base = inspector.clazz(TestClassBase.class);
               assertThat(base, isPresent());
               MethodSubject foo = base.uniqueMethodWithName("foo");
-              assertThat(foo, isPresent());
-              assertThat(foo, isRenamed());
+              assertThat(foo, isPresentAndRenamed());
               assertNotEquals("a", foo.getFinalName());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java b/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
index d8f3910..bb27506 100644
--- a/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
+++ b/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming.b130791310;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assume.assumeFalse;
@@ -110,13 +110,11 @@
 
   private void inspect(CodeInspector inspector, boolean isR8) {
     ClassSubject holder = inspector.clazz(SomeLogic.class);
-    assertThat(holder, isPresent());
-    assertThat(holder, not(isRenamed()));
+    assertThat(holder, isPresentAndNotRenamed());
     MethodSubject someMethod = holder.uniqueMethodWithName("someMethod");
     if (isR8) {
       if (onlyForceInlining) {
-        assertThat(someMethod, isPresent());
-        assertThat(someMethod, not(isRenamed()));
+        assertThat(someMethod, isPresentAndNotRenamed());
       } else {
         assertThat(someMethod, not(isPresent()));
       }
@@ -126,8 +124,7 @@
         // method signature modification.
         assertThat(someMethod, not(isPresent()));
       } else {
-        assertThat(someMethod, isPresent());
-        assertThat(someMethod, not(isRenamed()));
+        assertThat(someMethod, isPresentAndNotRenamed());
       }
     }
   }
diff --git a/src/test/java/com/android/tools/r8/naming/b133686361/AlreadyRenamedAbstractMethodRenamingTest.java b/src/test/java/com/android/tools/r8/naming/b133686361/AlreadyRenamedAbstractMethodRenamingTest.java
index d104210..7cda3cd 100644
--- a/src/test/java/com/android/tools/r8/naming/b133686361/AlreadyRenamedAbstractMethodRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/b133686361/AlreadyRenamedAbstractMethodRenamingTest.java
@@ -3,9 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming.b133686361;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -88,26 +87,20 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject base = inspector.clazz(Base.class);
-    assertThat(base, isPresent());
-    assertThat(base, isRenamed());
+    assertThat(base, isPresentAndRenamed());
     MethodSubject a = base.uniqueMethodWithName("a");
-    assertThat(a, isPresent());
-    assertThat(a, not(isRenamed()));
+    assertThat(a, isPresentAndNotRenamed());
 
     ClassSubject sub1 = inspector.clazz(Sub1.class);
-    assertThat(sub1, isPresent());
-    assertThat(sub1, isRenamed());
+    assertThat(sub1, isPresentAndRenamed());
     MethodSubject aInSub1 = sub1.uniqueMethodWithName("a");
-    assertThat(aInSub1, isPresent());
-    assertThat(aInSub1, not(isRenamed()));
+    assertThat(aInSub1, isPresentAndNotRenamed());
     assertEquals(a.getFinalName(), aInSub1.getFinalName());
 
     ClassSubject sub2 = inspector.clazz(Sub1.class);
-    assertThat(sub2, isPresent());
-    assertThat(sub2, isRenamed());
+    assertThat(sub2, isPresentAndRenamed());
     MethodSubject aInSub2 = sub2.uniqueMethodWithName("a");
-    assertThat(aInSub2, isPresent());
-    assertThat(aInSub2, not(isRenamed()));
+    assertThat(aInSub2, isPresentAndNotRenamed());
     assertEquals(a.getFinalName(), aInSub2.getFinalName());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/identifiernamestring/ClassNameComparisonSwitchTest.java b/src/test/java/com/android/tools/r8/naming/identifiernamestring/ClassNameComparisonSwitchTest.java
index 97a96cc..81038cf 100644
--- a/src/test/java/com/android/tools/r8/naming/identifiernamestring/ClassNameComparisonSwitchTest.java
+++ b/src/test/java/com/android/tools/r8/naming/identifiernamestring/ClassNameComparisonSwitchTest.java
@@ -4,8 +4,7 @@
 
 package com.android.tools.r8.naming.identifiernamestring;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -51,8 +50,7 @@
   private void verifyClassesHaveBeenMinified(CodeInspector inspector) {
     for (Class<?> clazz : ImmutableList.of(A.class, B.class, C.class)) {
       ClassSubject classSubject = inspector.clazz(clazz);
-      assertThat(classSubject, isPresent());
-      assertThat(classSubject, isRenamed());
+      assertThat(classSubject, isPresentAndRenamed());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/proguard/NonExistingConfigFileTest.java b/src/test/java/com/android/tools/r8/proguard/NonExistingConfigFileTest.java
index 7d0dc70..b241eff 100644
--- a/src/test/java/com/android/tools/r8/proguard/NonExistingConfigFileTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/NonExistingConfigFileTest.java
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.proguard;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.fail;
@@ -28,11 +27,11 @@
         .addKeepRuleFiles(pg)
         .compile()
         .assertNoMessages()
-        .inspect(inspector -> {
-          ClassSubject clazz = inspector.clazz(TestClass.class);
-          assertThat(clazz, isPresent());
-          assertThat(clazz, isRenamed());
-        });
+        .inspect(
+            inspector -> {
+              ClassSubject clazz = inspector.clazz(TestClass.class);
+              assertThat(clazz, isPresentAndRenamed());
+            });
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java b/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
index b7017e7..ddaf47f 100644
--- a/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -75,11 +75,9 @@
     );
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     ClassSubject classSubject = codeInspector.clazz(B111974287.class);
-    assertThat(classSubject, isPresent());
-    assertThat(classSubject, not(isRenamed()));
+    assertThat(classSubject, isPresentAndNotRenamed());
     FieldSubject fieldSubject = classSubject.field(B111974287.class.getTypeName(), "self");
-    assertThat(fieldSubject, isPresent());
-    assertThat(fieldSubject, not(isRenamed()));
+    assertThat(fieldSubject, isPresentAndNotRenamed());
     fieldSubject = classSubject.field(B111974287.class.getTypeName() + "[]", "clones");
     // TODO(b/111974287): Proguard6 kept and renamed the field with array type.
     if (shrinker == Shrinker.PROGUARD6) {
@@ -97,16 +95,14 @@
     );
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     ClassSubject classSubject = codeInspector.clazz(B111974287.class);
-    assertThat(classSubject, isPresent());
-    assertThat(classSubject, not(isRenamed()));
+    assertThat(classSubject, isPresentAndNotRenamed());
     DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.getMethodCollection().numberOfVirtualMethods());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
       assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
       MethodSubject methodSubject =
           classSubject.method(MethodSignature.fromDexMethod(encodedMethod.method));
-      assertThat(methodSubject, isPresent());
-      assertThat(methodSubject, not(isRenamed()));
+      assertThat(methodSubject, isPresentAndNotRenamed());
     }
   }
 
@@ -119,14 +115,11 @@
     );
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     ClassSubject classSubject = codeInspector.clazz(B111974287.class);
-    assertThat(classSubject, isPresent());
-    assertThat(classSubject, not(isRenamed()));
+    assertThat(classSubject, isPresentAndNotRenamed());
     FieldSubject fieldSubject = classSubject.field(B111974287.class.getTypeName(), "self");
-    assertThat(fieldSubject, isPresent());
-    assertThat(fieldSubject, not(isRenamed()));
+    assertThat(fieldSubject, isPresentAndNotRenamed());
     fieldSubject = classSubject.field(B111974287.class.getTypeName() + "[]", "clones");
-    assertThat(fieldSubject, isPresent());
-    assertThat(fieldSubject, not(isRenamed()));
+    assertThat(fieldSubject, isPresentAndNotRenamed());
   }
 
   @Test
@@ -138,16 +131,14 @@
     );
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     ClassSubject classSubject = codeInspector.clazz(B111974287.class);
-    assertThat(classSubject, isPresent());
-    assertThat(classSubject, not(isRenamed()));
+    assertThat(classSubject, isPresentAndNotRenamed());
     DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.getMethodCollection().numberOfVirtualMethods());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
       assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
       MethodSubject methodSubject =
           classSubject.method(MethodSignature.fromDexMethod(encodedMethod.method));
-      assertThat(methodSubject, isPresent());
-      assertThat(methodSubject, not(isRenamed()));
+      assertThat(methodSubject, isPresentAndNotRenamed());
     }
   }
 
@@ -160,16 +151,14 @@
     );
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     ClassSubject classSubject = codeInspector.clazz(B111974287.class);
-    assertThat(classSubject, isPresent());
-    assertThat(classSubject, not(isRenamed()));
+    assertThat(classSubject, isPresentAndNotRenamed());
     DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.getMethodCollection().numberOfVirtualMethods());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
       assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
       MethodSubject methodSubject =
           classSubject.method(MethodSignature.fromDexMethod(encodedMethod.method));
-      assertThat(methodSubject, isPresent());
-      assertThat(methodSubject, not(isRenamed()));
+      assertThat(methodSubject, isPresentAndNotRenamed());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/AtomicFieldUpdaterTest.java b/src/test/java/com/android/tools/r8/shaking/AtomicFieldUpdaterTest.java
index f9a6bea..7015177 100644
--- a/src/test/java/com/android/tools/r8/shaking/AtomicFieldUpdaterTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/AtomicFieldUpdaterTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.shaking;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
@@ -50,8 +50,8 @@
     // Verify that the field is still there.
     CodeInspector inspector = new CodeInspector(output, proguardMapPath);
     ClassSubject classSubject = inspector.clazz(AtomicFieldUpdaterTestClass.A.class.getName());
-    assertThat(classSubject, isRenamed());
-    assertThat(classSubject.field("int", "field"), isRenamed());
+    assertThat(classSubject, isPresentAndRenamed());
+    assertThat(classSubject.field("int", "field"), isPresentAndRenamed());
     // Check that the code runs.
     assertEquals(
         runOnJava(AtomicFieldUpdaterTestClass.class),
diff --git a/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java b/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
index ac18813..3c15d88 100644
--- a/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -173,7 +173,7 @@
         .inspect(
             inspector -> {
               FieldSubject fld = inspector.clazz(fieldHolder.name).uniqueFieldWithName(fieldName);
-              assertThat(fld, isRenamed());
+              assertThat(fld, isPresentAndRenamed());
 
               ClassSubject classSubject = inspector.clazz(clazz.name);
               assertThat(classSubject, isPresent());
@@ -370,7 +370,7 @@
       boolean isR8) {
     FieldSubject fld = inspector.clazz(fieldHolder.name).uniqueFieldWithName(fieldName);
     if (isR8) {
-      assertThat(fld, isRenamed());
+      assertThat(fld, isPresentAndRenamed());
     } else {
       assertThat(fld, isPresent());
     }
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
new file mode 100644
index 0000000..d989fbf
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
@@ -0,0 +1,297 @@
+// Copyright (c) 2020, 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.shaking;
+
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticException;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.R8;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.graphinspector.GraphInspector;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Sets.SetView;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+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 KeepAnnotatedMemberTest extends TestBase {
+
+  private static final Path R8_JAR = Paths.get(ToolHelper.THIRD_PARTY_DIR, "r8", "r8.jar");
+  private static final String ABSENT_ANNOTATION = "com.android.tools.r8.MissingAnnotation";
+  private static final String PRESENT_ANNOTATION =
+      "com.android.tools.r8.com.google.common.annotations.VisibleForTesting";
+
+  private static final String CLASS_WITH_ANNOTATED_METHOD =
+      "com.android.tools.r8.com.google.common.math.IntMath";
+
+  private static final String ANNOTATED_METHOD = "lessThanBranchFree";
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public KeepAnnotatedMemberTest(TestParameters parameters) {
+    parameters.assertNoneRuntime();
+  }
+
+  @Test
+  public void testPresence() throws Exception {
+    CodeInspector inspector = new CodeInspector(R8_JAR);
+    assertThat(inspector.clazz(ABSENT_ANNOTATION), not(isPresent()));
+    assertThat(inspector.clazz(PRESENT_ANNOTATION), isPresent());
+    ClassSubject clazz = inspector.clazz(CLASS_WITH_ANNOTATED_METHOD);
+    MethodSubject method = clazz.uniqueMethodWithName(ANNOTATED_METHOD);
+    assertThat(method, isPresent());
+  }
+
+  // TODO(b/159966986): A general keep rule should not cause compiler assertion errors.
+  @Test(expected = CompilationFailedException.class)
+  public void testPresentAnnotation() throws Exception {
+    testForR8(Backend.CF)
+        .addProgramFiles(R8_JAR)
+        .addKeepRules("-keep class * { @" + PRESENT_ANNOTATION + " *; }")
+        .compileWithExpectedDiagnostics(
+            diagnostics ->
+                diagnostics.assertErrorsMatch(diagnosticException(AssertionError.class)));
+  }
+
+  @Test
+  public void testPresentAnnotationSplit() throws Exception {
+    // These rules should be equivalent to the above.
+    testForR8(Backend.CF)
+        .addProgramFiles(R8_JAR)
+        .addKeepRules(
+            "-keep class *", "-keepclassmembers class * { @" + PRESENT_ANNOTATION + " *; }")
+        .compile();
+  }
+
+  @Test
+  public void testWithMembersAbsentAnnotation() throws Exception {
+    testForR8(Backend.CF)
+        .addProgramFiles(R8_JAR)
+        .allowUnusedProguardConfigurationRules()
+        .addKeepRules("-keepclasseswithmembers class * { @" + ABSENT_ANNOTATION + " *; }")
+        .compile()
+        .inspect(inspector -> assertEquals(0, inspector.allClasses().size()));
+  }
+
+  @Test
+  public void testWithMembersPresentAnnotation() throws Exception {
+    testForR8(Backend.CF)
+        .addProgramFiles(R8_JAR)
+        .addKeepRules("-keepclasseswithmembers class * { @" + PRESENT_ANNOTATION + " *** *(...); }")
+        .compile()
+        .inspect(
+            inspector -> {
+              ClassSubject clazz = inspector.clazz(CLASS_WITH_ANNOTATED_METHOD);
+              assertThat(clazz, isPresent());
+              assertThat(clazz.uniqueMethodWithName(ANNOTATED_METHOD), isPresent());
+            });
+  }
+
+  @Test
+  public void testUnsatisfiedClassMembersPresentAnnotation() throws Exception {
+    testForR8(Backend.CF)
+        .addProgramFiles(R8_JAR)
+        // TODO(b/159971974): Technically this rule does not hit anything and should fail due to
+        //  missing allowUnusedProguardConfigurationRules()
+        .addKeepRules("-keepclassmembers class * { @" + PRESENT_ANNOTATION + " *** *(...); }")
+        .compile()
+        .inspect(inspector -> assertEquals(0, inspector.allClasses().size()));
+  }
+
+  @Test
+  public void testSatisfiedClassMembersPresentAnnotation() throws Exception {
+    testForR8(Backend.CF)
+        .addProgramFiles(R8_JAR)
+        .addKeepClassRules(CLASS_WITH_ANNOTATED_METHOD)
+        .addKeepRules("-keepclassmembers class * { @" + PRESENT_ANNOTATION + " *** *(...); }")
+        .compile()
+        .inspect(
+            inspector -> {
+              assertEquals(1, inspector.allClasses().size());
+              List<FoundMethodSubject> methods =
+                  inspector.clazz(CLASS_WITH_ANNOTATED_METHOD).allMethods();
+              assertEquals(
+                  1, methods.stream().filter(m -> m.getOriginalName().equals("<init>")).count());
+              assertEquals(
+                  1,
+                  methods.stream()
+                      .filter(m -> m.getOriginalName().equals(ANNOTATED_METHOD))
+                      .count());
+              assertEquals(2, methods.size());
+            });
+  }
+
+  @Test
+  public void testUnsatisfiedConditionalPresentAnnotation() throws Exception {
+    testForR8(Backend.CF)
+        .addProgramFiles(R8_JAR)
+        .allowUnusedProguardConfigurationRules()
+        .addKeepRules("-if class * -keep class <1> { @" + PRESENT_ANNOTATION + " *** *(...); }")
+        .compile()
+        .inspect(inspector -> assertEquals(0, inspector.allClasses().size()));
+  }
+
+  @Test
+  public void testSatisfiedConditionalPresentAnnotation() throws Exception {
+    testForR8(Backend.CF)
+        .addProgramFiles(R8_JAR)
+        .addKeepClassRules(CLASS_WITH_ANNOTATED_METHOD)
+        .addKeepRules("-if class * -keep class <1> { @" + PRESENT_ANNOTATION + " *** *(...); }")
+        .compile()
+        .inspect(
+            inspector -> {
+              assertEquals(1, inspector.allClasses().size());
+              List<FoundMethodSubject> methods =
+                  inspector.clazz(CLASS_WITH_ANNOTATED_METHOD).allMethods();
+              assertEquals(
+                  1, methods.stream().filter(m -> m.getOriginalName().equals("<init>")).count());
+              // TODO(b/132318609): This should have the annotated method, but does not due to the
+              //  annotation being removed.
+              assertEquals(
+                  0,
+                  methods.stream()
+                      .filter(m -> m.getOriginalName().equals(ANNOTATED_METHOD))
+                      .count());
+              assertEquals(1, methods.size());
+            });
+  }
+
+  @Test
+  public void testConditionalEqualsKeepClassMembers() throws Exception {
+    GraphInspector referenceInspector =
+        testForR8(Backend.CF)
+            .enableGraphInspector()
+            .addProgramFiles(R8_JAR)
+            .addKeepMainRule(R8.class)
+            .addKeepClassRules(CLASS_WITH_ANNOTATED_METHOD)
+            // TODO(b/132318609): Remove keep annotation once fixed.
+            .addKeepClassRules(PRESENT_ANNOTATION)
+            .addKeepRules("-keepclassmembers class * { @" + PRESENT_ANNOTATION + " *** *(...); }")
+            .compile()
+            .graphInspector();
+
+    GraphInspector ifThenKeepClassMembersInspector =
+        testForR8(Backend.CF)
+            .enableGraphInspector()
+            .addProgramFiles(R8_JAR)
+            .addKeepMainRule(R8.class)
+            .addKeepClassRules(CLASS_WITH_ANNOTATED_METHOD)
+            // TODO(b/132318609): Remove keep annotation once fixed.
+            .addKeepClassRules(PRESENT_ANNOTATION)
+            .addKeepRules(
+                "-if class * "
+                    + "-keepclassmembers class <1> { @"
+                    + PRESENT_ANNOTATION
+                    + " *** *(...); }")
+            .compile()
+            .graphInspector();
+    // TODO(b/159418523): It appears that the insertion in never-inline causes additional retention.
+    assertRetainedClassesEqual(referenceInspector, ifThenKeepClassMembersInspector, false, true);
+
+    GraphInspector ifThenKeepClassesWithMembersInspector =
+        testForR8(Backend.CF)
+            .enableGraphInspector()
+            .addProgramFiles(R8_JAR)
+            .addKeepMainRule(R8.class)
+            .addKeepClassRules(CLASS_WITH_ANNOTATED_METHOD)
+            // TODO(b/132318609): Remove keep annotation once fixed.
+            .addKeepClassRules(PRESENT_ANNOTATION)
+            .addKeepRules(
+                "-if class * "
+                    + "-keepclasseswithmembers class <1> { @"
+                    + PRESENT_ANNOTATION
+                    + " *** *(...); }")
+            .compile()
+            .graphInspector();
+    // TODO(b/159418523): It appears that the insertion in never-inline causes additional retention.
+    assertRetainedClassesEqual(
+        referenceInspector, ifThenKeepClassesWithMembersInspector, false, true);
+
+    GraphInspector ifHasMemberThenKeepClassInspector =
+        testForR8(Backend.CF)
+            .enableGraphInspector()
+            .addProgramFiles(R8_JAR)
+            .addKeepMainRule(R8.class)
+            .addKeepClassRules(CLASS_WITH_ANNOTATED_METHOD)
+            // TODO(b/132318609): Remove keep annotation once fixed.
+            .addKeepClassRules(PRESENT_ANNOTATION)
+            .addKeepRules(
+                "-if class * { @"
+                    + PRESENT_ANNOTATION
+                    + " *** *(...); } "
+                    + "-keep class <1> { @"
+                    + PRESENT_ANNOTATION
+                    + " *** <2>(...); }")
+            .compile()
+            .graphInspector();
+    // TODO(b/159418523): It appears that the insertion in never-inline causes additional retention.
+    //  Also, here neither is a subset of the other. That also appears wrong.
+    assertRetainedClassesEqual(referenceInspector, ifHasMemberThenKeepClassInspector, true, true);
+  }
+
+  private void assertRetainedClassesEqual(
+      GraphInspector referenceResult,
+      GraphInspector conditionalResult,
+      boolean expectReferenceIsLarger,
+      boolean expectConditionalIsLarger) {
+    Set<String> referenceClasses =
+        new TreeSet<>(
+            referenceResult.codeInspector().allClasses().stream()
+                .map(c -> c.getOriginalName())
+                .collect(Collectors.toSet()));
+
+    Set<String> conditionalClasses =
+        conditionalResult.codeInspector().allClasses().stream()
+            .map(c -> c.getOriginalName())
+            .collect(Collectors.toSet());
+    {
+      SetView<String> notInReference = Sets.difference(conditionalClasses, referenceClasses);
+      if (expectConditionalIsLarger) {
+        assertFalse("Expected classes in -if rule to retain more.", notInReference.isEmpty());
+      } else {
+        assertEquals(
+            "Classes in -if rule that are not in -keepclassmembers rule",
+            Collections.emptySet(),
+            notInReference);
+      }
+    }
+    {
+      SetView<String> notInConditional = Sets.difference(referenceClasses, conditionalClasses);
+      if (expectReferenceIsLarger) {
+        assertFalse(
+            "Expected classes in -keepclassmembers rule to retain more.",
+            notInConditional.isEmpty());
+      } else {
+        assertEquals(
+            "Classes in -keepclassmembers rule that are not in -if rule",
+            Collections.emptySet(),
+            new TreeSet<>(notInConditional));
+      }
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/NonVirtualOverrideTest.java b/src/test/java/com/android/tools/r8/shaking/NonVirtualOverrideTest.java
index 8673412..bee167f 100644
--- a/src/test/java/com/android/tools/r8/shaking/NonVirtualOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/NonVirtualOverrideTest.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.shaking;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -183,7 +183,7 @@
     if (!enableClassInlining && !enableVerticalClassMerging) {
       CodeInspector inspector = compiled.inspector();
       ClassSubject classSubject = inspector.clazz(B.class.getName());
-      assertThat(classSubject, isRenamed());
+      assertThat(classSubject, isPresentAndRenamed());
       assertThat(classSubject.method("void", "m1", ImmutableList.of()), isPresent());
       assertThat(classSubject.method("void", "m2", ImmutableList.of()), not(isPresent()));
       assertThat(classSubject.method("void", "m3", ImmutableList.of()), isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/ParameterTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ParameterTypeTest.java
index 5cdbd87..59c649b 100644
--- a/src/test/java/com/android/tools/r8/shaking/ParameterTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ParameterTypeTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -136,14 +136,14 @@
             .inspector();
 
     ClassSubject superInterface1 = inspector.clazz(B112452064SuperInterface1.class);
-    assertThat(superInterface1, isRenamed());
+    assertThat(superInterface1, isPresentAndRenamed());
     MethodSubject foo = superInterface1.uniqueMethodWithName("foo");
     assertThat(foo, not(isPresent()));
     ClassSubject superInterface2 = inspector.clazz(B112452064SuperInterface2.class);
     if (enableVerticalClassMerging) {
       assertThat(superInterface2, not(isPresent()));
     } else {
-      assertThat(superInterface2, isRenamed());
+      assertThat(superInterface2, isPresentAndRenamed());
     }
     MethodSubject bar = superInterface2.uniqueMethodWithName("bar");
     assertThat(bar, not(isPresent()));
@@ -152,7 +152,7 @@
       assertThat(subInterface, not(isPresent()));
     } else {
       assertThat(subInterface, isPresent());
-      assertThat(subInterface, isRenamed());
+      assertThat(subInterface, isPresentAndRenamed());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ReturnTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ReturnTypeTest.java
index 4c25b86..98b7f80 100644
--- a/src/test/java/com/android/tools/r8/shaking/ReturnTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ReturnTypeTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.shaking;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assume.assumeTrue;
 
@@ -93,7 +93,7 @@
         .inspect(
             inspector -> {
               ClassSubject returnType = inspector.clazz(B112517039ReturnType.class);
-              assertThat(returnType, isRenamed());
+              assertThat(returnType, isPresentAndRenamed());
             });
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationsOnFieldsTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationsOnFieldsTest.java
index d24d8c1..edd818e 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationsOnFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationsOnFieldsTest.java
@@ -1,7 +1,7 @@
 package com.android.tools.r8.shaking.annotations;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static java.lang.annotation.ElementType.FIELD;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -59,18 +59,18 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(TestClass.class);
               assertThat(clazz, isPresent());
-              assertThat(clazz, isRenamed());
+              assertThat(clazz, isPresentAndRenamed());
 
               FieldSubject field = clazz.uniqueFieldWithName("field");
               assertThat(field, isPresent());
               assertThat(field.annotation(FieldAnnotation.class.getTypeName()), isPresent());
-              assertThat(inspector.clazz(FieldAnnotationUse.class), isRenamed());
+              assertThat(inspector.clazz(FieldAnnotationUse.class), isPresentAndRenamed());
 
               FieldSubject staticField = clazz.uniqueFieldWithName("staticField");
               assertThat(staticField, isPresent());
               assertThat(
                   staticField.annotation(StaticFieldAnnotation.class.getTypeName()), isPresent());
-              assertThat(inspector.clazz(StaticFieldAnnotationUse.class), isRenamed());
+              assertThat(inspector.clazz(StaticFieldAnnotationUse.class), isPresentAndRenamed());
             })
         .run(MainClass.class)
         .assertSuccess();
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/ReflectiveAnnotationUseTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/ReflectiveAnnotationUseTest.java
index 84ceffa..c975c82 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/ReflectiveAnnotationUseTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/ReflectiveAnnotationUseTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking.annotations;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.not;
@@ -105,20 +105,15 @@
             .assertSuccessWithOutput(JAVA_OUTPUT)
             .inspector();
     ClassSubject clazz = inspector.clazz(ANNOTATION_NAME);
-    assertThat(clazz, isPresent());
-    assertThat(clazz, not(isRenamed()));
+    assertThat(clazz, isPresentAndNotRenamed());
     MethodSubject f1 = clazz.uniqueMethodWithName("f1");
-    assertThat(f1, isPresent());
-    assertThat(f1, not(isRenamed()));
+    assertThat(f1, isPresentAndNotRenamed());
     MethodSubject f2 = clazz.uniqueMethodWithName("f2");
-    assertThat(f2, isPresent());
-    assertThat(f2, not(isRenamed()));
+    assertThat(f2, isPresentAndNotRenamed());
     MethodSubject f3 = clazz.uniqueMethodWithName("f3");
-    assertThat(f3, isPresent());
-    assertThat(f3, not(isRenamed()));
+    assertThat(f3, isPresentAndNotRenamed());
     MethodSubject f4 = clazz.uniqueMethodWithName("f4");
-    assertThat(f4, isPresent());
-    assertThat(f4, not(isRenamed()));
+    assertThat(f4, isPresentAndNotRenamed());
 
     ClassSubject impl = inspector.clazz(IMPL_CLASS_NAME);
     assertThat(impl, isPresent());
@@ -152,11 +147,9 @@
     assertThat(clazz, isPresent());
     assertEquals(minify, clazz.isRenamed());
     MethodSubject f1 = clazz.uniqueMethodWithName("f1");
-    assertThat(f1, isPresent());
-    assertThat(f1, not(isRenamed()));
+    assertThat(f1, isPresentAndNotRenamed());
     MethodSubject f2 = clazz.uniqueMethodWithName("f2");
-    assertThat(f2, isPresent());
-    assertThat(f2, not(isRenamed()));
+    assertThat(f2, isPresentAndNotRenamed());
     MethodSubject f3 = clazz.uniqueMethodWithName("f3");
     assertThat(f3, not(isPresent()));
     MethodSubject f4 = clazz.uniqueMethodWithName("f4");
@@ -190,11 +183,9 @@
     assertThat(clazz, isPresent());
     assertEquals(minify, clazz.isRenamed());
     MethodSubject f1 = clazz.uniqueMethodWithName("f1");
-    assertThat(f1, isPresent());
-    assertThat(f1, not(isRenamed()));
+    assertThat(f1, isPresentAndNotRenamed());
     MethodSubject f2 = clazz.uniqueMethodWithName("f2");
-    assertThat(f2, isPresent());
-    assertThat(f2, not(isRenamed()));
+    assertThat(f2, isPresentAndNotRenamed());
     MethodSubject f3 = clazz.uniqueMethodWithName("f3");
     assertThat(f3, not(isPresent()));
     MethodSubject f4 = clazz.uniqueMethodWithName("f4");
diff --git a/src/test/java/com/android/tools/r8/shaking/attributes/KeepInnerClassesEnclosingMethodAnnotationsTest.java b/src/test/java/com/android/tools/r8/shaking/attributes/KeepInnerClassesEnclosingMethodAnnotationsTest.java
index 3b060f0..87c3303 100644
--- a/src/test/java/com/android/tools/r8/shaking/attributes/KeepInnerClassesEnclosingMethodAnnotationsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/attributes/KeepInnerClassesEnclosingMethodAnnotationsTest.java
@@ -6,7 +6,8 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isMemberClass;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -123,8 +124,8 @@
                 "-keepattributes InnerClasses,EnclosingMethod",
                 "-keep class **Outer*",
                 keepMainProguardConfiguration(Main.class)));
-    assertThat(result.outer, not(isRenamed()));
-    assertThat(result.inner, not(isRenamed()));
+    assertThat(result.outer, isPresentAndNotRenamed());
+    assertThat(result.inner, isPresentAndNotRenamed());
     assertThat(result.inner, isMemberClass());
     fullInnerClassesEnclosingMethodInformation(result);
   }
@@ -134,8 +135,8 @@
     TestResult result =
         runShrinker(
             ImmutableList.of("-keep class **Outer*", keepMainProguardConfiguration(Main.class)));
-    assertThat(result.outer, not(isRenamed()));
-    assertThat(result.inner, not(isRenamed()));
+    assertThat(result.outer, isPresentAndNotRenamed());
+    assertThat(result.inner, isPresentAndNotRenamed());
     assertThat(result.inner, not(isMemberClass()));
     noInnerClassesEnclosingMethodInformation(result);
   }
@@ -148,8 +149,8 @@
                 "-keepattributes InnerClasses,EnclosingMethod",
                 "-keep class **Outer$Inner",
                 keepMainProguardConfiguration(Main.class)));
-    assertThat(result.outer, not(isRenamed()));
-    assertThat(result.inner, not(isRenamed()));
+    assertThat(result.outer, isPresentAndNotRenamed());
+    assertThat(result.inner, isPresentAndNotRenamed());
     assertThat(result.inner, isMemberClass());
     fullInnerClassesEnclosingMethodInformation(result);
   }
@@ -162,8 +163,8 @@
                 "-keepattributes InnerClasses,EnclosingMethod",
                 "-keep class **Outer",
                 keepMainProguardConfiguration(Main.class)));
-    assertThat(result.outer, not(isRenamed()));
-    assertThat(result.inner, isRenamed());
+    assertThat(result.outer, isPresentAndNotRenamed());
+    assertThat(result.inner, isPresentAndRenamed());
     assertThat(result.inner, isMemberClass());
     fullInnerClassesEnclosingMethodInformation(result);
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/b113138046/NativeMethodTest.java b/src/test/java/com/android/tools/r8/shaking/b113138046/NativeMethodTest.java
index 15fba7f..686c35b 100644
--- a/src/test/java/com/android/tools/r8/shaking/b113138046/NativeMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/b113138046/NativeMethodTest.java
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.b113138046;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -63,7 +62,7 @@
           "void", "foo", ImmutableList.of(Handler.class.getCanonicalName()));
       assertEquals(expectedFooPresence, nativeFoo.isPresent());
       if (expectedFooPresence) {
-        assertThat(nativeFoo, not(isRenamed()));
+        assertThat(nativeFoo, isPresentAndNotRenamed());
         DexEncodedMethod method = nativeFoo.getMethod();
         assertTrue(method.accessFlags.isNative());
         assertNull(method.getCode());
diff --git a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
index eebb7d5..32a861a 100644
--- a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
@@ -4,67 +4,53 @@
 
 package com.android.tools.r8.shaking.defaultmethods;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbstract;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.ClassFileConsumer;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.ThrowingConsumer;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
-import java.util.function.Consumer;
 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 DefaultMethodsTest extends TestBase {
 
-  private Backend backend;
+  private final TestParameters parameters;
 
-  @Parameterized.Parameters(name = "Backend: {0}")
-  public static Backend[] data() {
-    return ToolHelper.getBackends();
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
   }
 
-  public DefaultMethodsTest(Backend backend) {
-    this.backend = backend;
+  public DefaultMethodsTest(TestParameters parameters) {
+    this.parameters = parameters;
   }
 
-  private void runTest(List<String> additionalKeepRules, Consumer<CodeInspector> inspection)
+  private void runTest(
+      List<String> additionalKeepRules,
+      ThrowingConsumer<CodeInspector, RuntimeException> inspection)
       throws Exception {
-    R8Command.Builder builder = R8Command.builder();
-    builder.addProgramFiles(ToolHelper.getClassFileForTestClass(InterfaceWithDefaultMethods.class));
-    builder.addProgramFiles(ToolHelper.getClassFileForTestClass(ClassImplementingInterface.class));
-    builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class));
-    if (backend == Backend.DEX) {
-      builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-      int apiLevel = AndroidApiLevel.O.getLevel();
-      builder.setMinApiLevel(apiLevel);
-      builder.addLibraryFiles(ToolHelper.getAndroidJar(apiLevel));
-    } else {
-      assert backend == Backend.CF;
-      builder.setProgramConsumer(ClassFileConsumer.emptyConsumer());
-      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
-    }
-    // Always keep main in the test class, so the output never becomes empty.
-    builder.addProguardConfiguration(ImmutableList.of(
-        "-keep class " + TestClass.class.getCanonicalName() + "{",
-        "  public static void main(java.lang.String[]);",
-        "}",
-        "-dontobfuscate"),
-        Origin.unknown());
-    builder.addProguardConfiguration(additionalKeepRules, Origin.unknown());
-    AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    inspection.accept(new CodeInspector(app));
+    testForR8(parameters.getBackend())
+        .addProgramClasses(
+            InterfaceWithDefaultMethods.class, ClassImplementingInterface.class, TestClass.class)
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(TestClass.class)
+        .addKeepRules(additionalKeepRules)
+        .noMinification()
+        .compile()
+        .inspect(inspection);
   }
 
   private void interfaceNotKept(CodeInspector inspector) {
@@ -73,53 +59,98 @@
 
   private void defaultMethodNotKept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
-    assertTrue(clazz.isPresent());
-    assertFalse(clazz.method("int", "method", ImmutableList.of()).isPresent());
+    assertThat(clazz, isPresent());
+    assertThat(clazz.method("int", "method", ImmutableList.of()), not(isPresent()));
   }
 
   private void defaultMethodKept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
-    assertTrue(clazz.isPresent());
+    assertThat(clazz, isPresent());
     MethodSubject method = clazz.method("int", "method", ImmutableList.of());
-    assertTrue(method.isPresent());
-    assertFalse(method.isAbstract());
+    assertThat(method, isPresent());
+    ClassSubject companionClass = clazz.toCompanionClass();
+    if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
+      assertThat(method, not(isAbstract()));
+      assertThat(companionClass, not(isPresent()));
+    } else {
+      assertThat(method, isAbstract());
+      assertThat(companionClass, isPresent());
+      MethodSubject defaultMethod = method.toMethodOnCompanionClass();
+      assertThat(defaultMethod, isPresent());
+    }
+  }
+
+  private void defaultMethodKeptWithoutCompanionClass(CodeInspector inspector) {
+    ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
+    assertThat(clazz, isPresent());
+    MethodSubject method = clazz.method("int", "method", ImmutableList.of());
+    assertThat(method, isPresent());
+    ClassSubject companionClass = clazz.toCompanionClass();
+    if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
+      assertThat(method, not(isAbstract()));
+    } else {
+      assertThat(method, isAbstract());
+    }
+    assertThat(companionClass, not(isPresent()));
   }
 
   @Test
-  public void test() throws Exception {
+  public void testInterfaceNotKept() throws Exception {
     runTest(ImmutableList.of(), this::interfaceNotKept);
-    runTest(ImmutableList.of(
-        "-keep interface " + InterfaceWithDefaultMethods.class.getCanonicalName() + "{",
-        "}"
-    ), this::defaultMethodNotKept);
-    runTest(ImmutableList.of(
-        "-keep interface " + InterfaceWithDefaultMethods.class.getCanonicalName() + "{",
-        "  <methods>;",
-        "}"
-    ), this::defaultMethodKept);
-    runTest(ImmutableList.of(
-        "-keep interface " + InterfaceWithDefaultMethods.class.getCanonicalName() + "{",
-        "  public int method();",
-        "}"
-    ), this::defaultMethodKept);
+  }
+
+  @Test
+  public void testDefaultMethodNotKept() throws Exception {
     runTest(
         ImmutableList.of(
-            "-keep class " + ClassImplementingInterface.class.getCanonicalName() + "{",
+            "-keep interface " + InterfaceWithDefaultMethods.class.getTypeName() + "{", "}"),
+        this::defaultMethodNotKept);
+  }
+
+  @Test
+  public void testDefaultMethodKeptWithMethods() throws Exception {
+    runTest(
+        ImmutableList.of(
+            "-keep interface " + InterfaceWithDefaultMethods.class.getTypeName() + "{",
+            "  <methods>;",
+            "}"),
+        this::defaultMethodKept);
+  }
+
+  @Test
+  public void testDefaultMethodsKeptExplicitly() throws Exception {
+    runTest(
+        ImmutableList.of(
+            "-keep interface " + InterfaceWithDefaultMethods.class.getTypeName() + "{",
+            "  public int method();",
+            "}"),
+        this::defaultMethodKept);
+  }
+
+  @Test
+  public void testDefaultMethodNotKeptIndirectly() throws Exception {
+    runTest(
+        ImmutableList.of(
+            "-keep class " + ClassImplementingInterface.class.getTypeName() + "{",
             "  <methods>;",
             "}",
             // Prevent InterfaceWithDefaultMethods from being merged into ClassImplementingInterface
-            "-keep class " + InterfaceWithDefaultMethods.class.getCanonicalName()),
+            "-keep class " + InterfaceWithDefaultMethods.class.getTypeName()),
         this::defaultMethodNotKept);
+  }
+
+  @Test
+  public void testDefaultMethodKeptIndirectly() throws Exception {
     runTest(
         ImmutableList.of(
-            "-keep class " + ClassImplementingInterface.class.getCanonicalName() + "{",
+            "-keep class " + ClassImplementingInterface.class.getTypeName() + "{",
             "  <methods>;",
             "}",
             "-keep class " + TestClass.class.getCanonicalName() + "{",
             "  public void useInterfaceMethod();",
             "}",
             // Prevent InterfaceWithDefaultMethods from being merged into ClassImplementingInterface
-            "-keep class " + InterfaceWithDefaultMethods.class.getCanonicalName()),
-        this::defaultMethodKept);
+            "-keep class " + InterfaceWithDefaultMethods.class.getTypeName()),
+        this::defaultMethodKeptWithoutCompanionClass);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/ConditionalKeepIfKeptTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/ConditionalKeepIfKeptTest.java
index 790ea8d..34c9293 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/ConditionalKeepIfKeptTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/ConditionalKeepIfKeptTest.java
@@ -4,8 +4,8 @@
 package com.android.tools.r8.shaking.ifrule;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -160,10 +160,10 @@
               ClassSubject classSubject = inspector.clazz(StaticallyReferenced.class);
               assertThat(classSubject, isPresent());
               assertEquals(3, classSubject.allMethods().size());
-              classSubject.allMethods().forEach(m -> assertThat(m, not(isRenamed())));
+              classSubject.allMethods().forEach(m -> assertThat(m, isPresentAndNotRenamed()));
               // Keeping methods will cause the fields to be kept too (but allow renaming them).
               assertEquals(2, classSubject.allFields().size());
-              classSubject.allFields().forEach(f -> assertThat(f, isRenamed()));
+              classSubject.allFields().forEach(f -> assertThat(f, isPresentAndRenamed()));
             });
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
index 50d64f8..74d2cfb 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.ifrule;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isNotRenamed;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -108,7 +108,7 @@
     }
 
     ClassSubject clazz = codeInspector.clazz(DependentUser.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     // Members of DependentUser are not used anywhere.
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
     assertThat(m, not(isPresent()));
@@ -117,7 +117,7 @@
 
     // Although DependentUser#callFoo is shrinked, Dependent is kept via -if.
     clazz = codeInspector.clazz(Dependent.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     // But, its members are gone.
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     assertThat(m, not(isPresent()));
@@ -145,7 +145,7 @@
     }
 
     ClassSubject clazz = codeInspector.clazz(DependentUser.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     // Members of DependentUser are not used anywhere.
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
     assertThat(m, not(isPresent()));
@@ -154,7 +154,7 @@
 
     // Although DependentUser#callFoo is shrinked, Dependent is kept via -if.
     clazz = codeInspector.clazz(Dependent.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     // But, its members are gone.
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     assertThat(m, not(isPresent()));
@@ -178,19 +178,19 @@
     }
 
     ClassSubject clazz = codeInspector.clazz(DependentUser.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
-    assertThat(m, isRenamed());
+    assertThat(m, isPresentAndRenamed());
     FieldSubject f = clazz.field("int", "canBeShrinked");
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
     clazz = codeInspector.clazz(Dependent.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
-    assertThat(m, isRenamed());
+    assertThat(m, isPresentAndRenamed());
     f = clazz.field("int", "intField");
-    assertThat(f, isRenamed());
+    assertThat(f, isPresentAndRenamed());
   }
 
   @Test
@@ -227,19 +227,19 @@
     }
 
     ClassSubject clazz = codeInspector.clazz(DependentUser.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
-    assertThat(m, isRenamed());
+    assertThat(m, isPresentAndRenamed());
     FieldSubject f = clazz.field("int", "canBeShrinked");
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
     clazz = codeInspector.clazz(Dependent.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
-    assertThat(m, isRenamed());
+    assertThat(m, isPresentAndRenamed());
     f = clazz.field("int", "intField");
-    assertThat(f, isRenamed());
+    assertThat(f, isPresentAndRenamed());
   }
 
   @Test
@@ -276,19 +276,19 @@
     }
 
     ClassSubject clazz = codeInspector.clazz(DependentUser.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
-    assertThat(m, isRenamed());
+    assertThat(m, isPresentAndRenamed());
     FieldSubject f = clazz.field("int", "canBeShrinked");
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
     clazz = codeInspector.clazz(Dependent.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
-    assertThat(m, isRenamed());
+    assertThat(m, isPresentAndRenamed());
     f = clazz.field("int", "intField");
-    assertThat(f, isRenamed());
+    assertThat(f, isPresentAndRenamed());
   }
 
   @Test
@@ -307,11 +307,11 @@
 
     ClassSubject clazz = codeInspector.clazz(Dependent.class);
     // Only class name is not renamed, if triggered.
-    assertThat(clazz, keepPrecondition ? isNotRenamed() : isRenamed());
+    assertThat(clazz, keepPrecondition ? isPresentAndNotRenamed() : isPresentAndRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
-    assertThat(m, isRenamed());
+    assertThat(m, isPresentAndRenamed());
     FieldSubject f = clazz.field("int", "intField");
-    assertThat(f, isRenamed());
+    assertThat(f, isPresentAndRenamed());
   }
 
   @Test
@@ -332,12 +332,12 @@
 
     ClassSubject clazz = codeInspector.clazz(Dependent.class);
     // Class name is not renamed, if triggered.
-    assertThat(clazz, keepPrecondition ? isNotRenamed() : isRenamed());
+    assertThat(clazz, keepPrecondition ? isPresentAndNotRenamed() : isPresentAndRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     // Method name is not renamed either, if triggered.
-    assertThat(m, keepPrecondition ? isNotRenamed() : isRenamed());
+    assertThat(m, keepPrecondition ? isPresentAndNotRenamed() : isPresentAndRenamed());
     FieldSubject f = clazz.field("int", "intField");
-    assertThat(f, isRenamed());
+    assertThat(f, isPresentAndRenamed());
   }
 
   @Test
@@ -357,11 +357,11 @@
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
 
     ClassSubject clazz = codeInspector.clazz(Dependent.class);
-    assertThat(clazz, isRenamed());
+    assertThat(clazz, isPresentAndRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     // Only method name is not renamed, if triggered.
-    assertThat(m, keepPrecondition ? isNotRenamed() : isRenamed());
+    assertThat(m, keepPrecondition ? isPresentAndNotRenamed() : isPresentAndRenamed());
     FieldSubject f = clazz.field("int", "intField");
-    assertThat(f, isRenamed());
+    assertThat(f, isPresentAndRenamed());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnTargetedMethodTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnTargetedMethodTest.java
index 35d802c..153bf38 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnTargetedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnTargetedMethodTest.java
@@ -4,8 +4,7 @@
 
 package com.android.tools.r8.shaking.ifrule;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestBase;
@@ -35,8 +34,7 @@
             .inspector();
 
     ClassSubject interfaceSubject = inspector.clazz(Interface.class);
-    assertThat(interfaceSubject, isPresent());
-    assertThat(interfaceSubject, isRenamed());
+    assertThat(interfaceSubject, isPresentAndRenamed());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersRuleOnIndirectlyInstantiatedClassTest.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersRuleOnIndirectlyInstantiatedClassTest.java
index 327f61d..5b47f4f 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersRuleOnIndirectlyInstantiatedClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersRuleOnIndirectlyInstantiatedClassTest.java
@@ -5,8 +5,7 @@
 package com.android.tools.r8.shaking.keepclassmembers;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
-import static org.hamcrest.CoreMatchers.not;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.NeverInline;
@@ -59,8 +58,7 @@
     assertThat(classSubject, isPresent());
 
     FieldSubject fieldSubject = classSubject.uniqueFieldWithName("greeting");
-    assertThat(fieldSubject, isPresent());
-    assertThat(fieldSubject, not(isRenamed()));
+    assertThat(fieldSubject, isPresentAndNotRenamed());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepInterfaceMethodTest.java
index e6baeae..93309e8 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepInterfaceMethodTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.shaking.keepclassmembers;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isNotRenamed;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assume.assumeTrue;
 
@@ -96,7 +96,7 @@
     ClassSubject clazzSubject = inspector.clazz(clazz);
     assertThat(clazzSubject, isPresent());
     MethodSubject foo = clazzSubject.uniqueMethodWithName("foo");
-    assertThat(foo, isNotRenamed());
+    assertThat(foo, isPresentAndNotRenamed());
   }
 
   public interface I {
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
index f2f6731..45c7a00 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
@@ -5,7 +5,8 @@
 package com.android.tools.r8.shaking.keepclassmembers.b115867670;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -105,7 +106,7 @@
       assertThat(cls, isPresent());
       assertFalse("Class " + clazz.getSimpleName() + " should not be abstract", cls.isAbstract());
       assertEquals(1, cls.asFoundClassSubject().allFields().size());
-      cls.forAllFields(field -> assertThat(field, not(isRenamed())));
+      cls.forAllFields(field -> assertThat(field, isPresentAndNotRenamed()));
     }
   }
 
@@ -114,10 +115,10 @@
     for (Class clazz : new Class[] {Foo.class, Foo.Interaction.class, Foo.Request.class}) {
       ClassSubject cls = inspector.clazz(clazz);
       assertThat(cls, isPresent());
-      assertThat(cls, isRenamed());
+      assertThat(cls, isPresentAndRenamed());
       assertFalse("Class " + clazz.getSimpleName() + " should not be abstract", cls.isAbstract());
       assertEquals(1, cls.asFoundClassSubject().allFields().size());
-      cls.forAllFields(field -> assertThat(field, isRenamed()));
+      cls.forAllFields(field -> assertThat(field, isPresentAndRenamed()));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/proxy/MockitoTest.java b/src/test/java/com/android/tools/r8/shaking/proxy/MockitoTest.java
index a084679..cea851e 100644
--- a/src/test/java/com/android/tools/r8/shaking/proxy/MockitoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/proxy/MockitoTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking.proxy;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -86,7 +86,6 @@
     ClassSubject itf = inspector.clazz(M_I);
     assertThat(itf, isPresent());
     MethodSubject mtd = itf.uniqueMethodWithName("onEnterForeground");
-    assertThat(mtd, isPresent());
-    assertThat(mtd, not(isRenamed()));
+    assertThat(mtd, isPresentAndNotRenamed());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/staticinterfacemethods/defaultmethods/StaticInterfaceMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/staticinterfacemethods/defaultmethods/StaticInterfaceMethodsTest.java
new file mode 100644
index 0000000..ca0aaa5
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/staticinterfacemethods/defaultmethods/StaticInterfaceMethodsTest.java
@@ -0,0 +1,224 @@
+// Copyright (c) 2018, 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.shaking.staticinterfacemethods.defaultmethods;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isStatic;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.ThrowingConsumer;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class StaticInterfaceMethodsTest extends TestBase {
+
+  private final TestParameters parameters;
+  private final boolean allowObfuscation;
+
+  @Parameterized.Parameters(name = "{0}, allowObfuscation: {1}")
+  public static Collection<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
+  }
+
+  public StaticInterfaceMethodsTest(TestParameters parameters, boolean allowObfuscation) {
+    this.parameters = parameters;
+    this.allowObfuscation = allowObfuscation;
+  }
+
+  private R8TestCompileResult compileTest(
+      List<String> additionalKeepRules,
+      ThrowingConsumer<CodeInspector, RuntimeException> inspection)
+      throws Exception {
+    return testForR8(parameters.getBackend())
+        .addProgramClasses(InterfaceWithStaticMethods.class, TestClass.class)
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(TestClass.class)
+        .addKeepRules(additionalKeepRules)
+        .enableInliningAnnotations()
+        .compile()
+        .inspect(inspection);
+  }
+
+  private void runTest(
+      List<String> additionalKeepRules,
+      ThrowingConsumer<CodeInspector, RuntimeException> inspection)
+      throws Exception {
+    R8TestCompileResult compileResult = compileTest(additionalKeepRules, inspection);
+    Path app = compileResult.writeToZip();
+
+    TestRunResult<?> result;
+    if (allowObfuscation) {
+      result =
+          testForR8(parameters.getBackend())
+              .addProgramClasses(InstrumentedTestClass.class)
+              .addKeepAllClassesRule()
+              .addApplyMapping(compileResult.getProguardMap())
+              .addClasspathClasses(InterfaceWithStaticMethods.class)
+              .setMinApi(parameters.getApiLevel())
+              .compile()
+              .addRunClasspathFiles(app)
+              .run(parameters.getRuntime(), InstrumentedTestClass.class);
+    } else {
+      result =
+          testForRuntime(parameters)
+              .addProgramClasses(InstrumentedTestClass.class)
+              .addClasspathFiles(app)
+              .addRunClasspathFiles(app)
+              .run(parameters.getRuntime(), InstrumentedTestClass.class);
+    }
+    if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
+      result.assertSuccessWithOutputLines("42");
+    } else {
+      result.assertFailure();
+    }
+  }
+
+  private void interfaceNotKept(CodeInspector inspector) {
+    assertFalse(inspector.clazz(InterfaceWithStaticMethods.class).isPresent());
+  }
+
+  private void staticMethodNotKept(CodeInspector inspector) {
+    ClassSubject clazz = inspector.clazz(InterfaceWithStaticMethods.class);
+    assertTrue(clazz.isPresent());
+    assertFalse(clazz.method("int", "method", ImmutableList.of()).isPresent());
+  }
+
+  private void staticMethodKeptB159987443(CodeInspector inspector) {
+    ClassSubject clazz = inspector.clazz(InterfaceWithStaticMethods.class);
+    assertThat(clazz, isPresent());
+    MethodSubject method = clazz.method("int", "method", ImmutableList.of());
+    ClassSubject companionClass = clazz.toCompanionClass();
+    if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
+      assertThat(method, isStatic());
+      assertThat(companionClass, not(isPresent()));
+    } else {
+      assertThat(method, not(isPresent()));
+      // TODO(159987443): The companion class should be present.
+      assertThat(companionClass, not(isPresent()));
+      // Also check that method exists on companion class.
+    }
+  }
+
+  private void staticMethodKept(CodeInspector inspector) {
+    ClassSubject clazz = inspector.clazz(InterfaceWithStaticMethods.class);
+    ClassSubject companionClass = clazz.toCompanionClass();
+    MethodSubject method = clazz.method("int", "method", ImmutableList.of());
+    if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
+      assertThat(clazz, allowObfuscation ? isPresentAndRenamed() : isPresentAndNotRenamed());
+      assertThat(method, isStatic());
+      assertThat(companionClass, not(isPresent()));
+    } else {
+      // When there is only a static method in the interface nothing is left on the interface itself
+      // after desugaring, only the companion class is left.
+      assertThat(clazz, not(isPresent()));
+      assertThat(method, not(isPresent()));
+      // TODO(159987443): The companion class should be present.
+      assertThat(companionClass, not(isPresent()));
+      // Also check that method exists on companion class.
+    }
+  }
+
+  @Test
+  public void testInterfaceNotKept() throws Exception {
+    assumeTrue(!allowObfuscation); // No use of allowObfuscation.
+
+    compileTest(ImmutableList.of(), this::interfaceNotKept);
+  }
+
+  @Test
+  public void testStaticMethodNotKept() throws Exception {
+    assumeTrue(!allowObfuscation); // No use of allowObfuscation.
+
+    compileTest(
+        ImmutableList.of(
+            "-keep interface " + InterfaceWithStaticMethods.class.getTypeName() + "{", "}"),
+        this::staticMethodNotKept);
+  }
+
+  @Test
+  public void testDefaultMethodKeptWithMethods() throws Exception {
+    assumeTrue(!allowObfuscation); // No use of allowObfuscation.
+
+    compileTest(
+        ImmutableList.of(
+            "-keep interface " + InterfaceWithStaticMethods.class.getTypeName() + "{",
+            "  <methods>;",
+            "}"),
+        this::staticMethodKeptB159987443);
+  }
+
+  @Test
+  public void testDefaultMethodKeptIndirectly() throws Exception {
+    ImmutableList.Builder<String> builder = ImmutableList.builder();
+    builder.add(
+        "-keep class " + TestClass.class.getTypeName() + "{",
+        "  public void useStaticInterfaceMethod();",
+        "}");
+    if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
+      // TODO(160142903): @NeverInline does not seem to work on static interface methods.
+      // TODO(160144053): Using -keepclassmembers for this cause InterfaceWithStaticMethods to
+      // be renamed.
+      if (allowObfuscation) {
+        builder.add(
+            "-if class " + InterfaceWithStaticMethods.class.getTypeName(),
+            "-keep,allowobfuscation class " + InterfaceWithStaticMethods.class.getTypeName() + "{",
+            "  public static int method();",
+            "}");
+      } else {
+        builder.add(
+            "-if class " + InterfaceWithStaticMethods.class.getTypeName(),
+            "-keep class " + InterfaceWithStaticMethods.class.getTypeName() + "{",
+            "  public static int method();",
+            "}");
+      }
+    }
+    runTest(builder.build(), this::staticMethodKept);
+  }
+
+  public static class TestClass {
+
+    public void useStaticInterfaceMethod() {
+      System.out.println(InterfaceWithStaticMethods.method());
+    }
+
+    public static void main(String[] args) {}
+  }
+
+  public interface InterfaceWithStaticMethods {
+    @NeverInline
+    static int method() {
+      return 42;
+    }
+  }
+
+  public static class InstrumentedTestClass {
+
+    public static void main(String[] args) {
+      System.out.println(InterfaceWithStaticMethods.method());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index 81b988e..6a04a0a 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -7,12 +7,17 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.references.ClassReference;
 import java.util.List;
 import java.util.function.Consumer;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public class AbsentClassSubject extends ClassSubject {
 
+  public AbsentClassSubject(CodeInspector codeInspector, ClassReference reference) {
+    super(codeInspector, reference);
+  }
+
   @Override
   public boolean isPresent() {
     return false;
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
index 38dc236..c62f945 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
@@ -142,4 +142,9 @@
   public String getJvmMethodSignatureAsString() {
     return null;
   }
+
+  @Override
+  public MethodSubject toMethodOnCompanionClass() {
+    throw new Unreachable("Cannot determine companion class method");
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index 97a3b29..84d76a1 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -4,10 +4,14 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
+import static com.android.tools.r8.ir.desugar.InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX;
+
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
+import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.utils.ListUtils;
@@ -23,6 +27,14 @@
 
 public abstract class ClassSubject extends Subject {
 
+  protected final ClassReference reference;
+  protected final CodeInspector codeInspector;
+
+  public ClassSubject(CodeInspector codeInspector, ClassReference reference) {
+    this.codeInspector = codeInspector;
+    this.reference = reference;
+  }
+
   public abstract void forAllMethods(Consumer<FoundMethodSubject> inspection);
 
   public final List<FoundMethodSubject> allMethods() {
@@ -192,4 +204,11 @@
   public abstract KmPackageSubject getKmPackage();
 
   public abstract KotlinClassMetadata getKotlinClassMetadata();
+
+  public ClassSubject toCompanionClass() {
+    String descriptor = reference.getDescriptor();
+    return codeInspector.clazz(
+        Reference.classFromDescriptor(
+            descriptor.substring(0, descriptor.length() - 1) + COMPANION_CLASS_NAME_SUFFIX + ";"));
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 76ed0e2..43ba1fb 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -48,6 +48,7 @@
 import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -280,9 +281,9 @@
     }
     DexClass clazz = application.definitionFor(toDexTypeIgnorePrimitives(name));
     if (clazz == null) {
-      return new AbsentClassSubject();
+      return new AbsentClassSubject(this, reference);
     }
-    return new FoundClassSubject(this, clazz, naming);
+    return new FoundClassSubject(this, clazz, naming, reference);
   }
 
   public ClassSubject companionClassFor(Class<?> clazz) {
@@ -308,6 +309,10 @@
     return builder.build();
   }
 
+  public FieldSubject field(Field field) {
+    return field(Reference.fieldFromField(field));
+  }
+
   public FieldSubject field(FieldReference field) {
     ClassSubject clazz = clazz(field.getHolderClass());
     if (!clazz.isPresent()) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 2ce3024..bd65812 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -24,6 +24,7 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.naming.MemberNaming.Signature;
 import com.android.tools.r8.naming.signature.GenericSignatureParser;
+import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
@@ -32,13 +33,15 @@
 
 public class FoundClassSubject extends ClassSubject {
 
-  private final CodeInspector codeInspector;
   private final DexClass dexClass;
   final ClassNamingForNameMapper naming;
 
   FoundClassSubject(
-      CodeInspector codeInspector, DexClass dexClass, ClassNamingForNameMapper naming) {
-    this.codeInspector = codeInspector;
+      CodeInspector codeInspector,
+      DexClass dexClass,
+      ClassNamingForNameMapper naming,
+      ClassReference reference) {
+    super(codeInspector, reference);
     this.dexClass = dexClass;
     this.naming = naming;
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmDeclarationContainerSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmDeclarationContainerSubject.java
index 6363747..a74c3d8 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmDeclarationContainerSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundKmDeclarationContainerSubject.java
@@ -129,7 +129,7 @@
   default ClassSubject getClassSubjectFromKmType(KmType kmType) {
     String descriptor = getDescriptorFromKmType(kmType);
     if (descriptor == null) {
-      return new AbsentClassSubject();
+      return new AbsentClassSubject(codeInspector(), Reference.classFromDescriptor("Lnot_found;"));
     }
     return getClassSubjectFromDescriptor(descriptor);
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index 1f1fe84..d4f8b5b 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
+import static com.android.tools.r8.ir.desugar.InterfaceMethodRewriter.DEFAULT_METHOD_PREFIX;
+
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfPosition;
 import com.android.tools.r8.code.Instruction;
@@ -31,6 +33,7 @@
 import com.android.tools.r8.naming.signature.GenericSignatureParser;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.LocalVariableTable.LocalVariableTableEntry;
 import com.google.common.base.Predicates;
@@ -39,6 +42,7 @@
 import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.List;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -372,4 +376,19 @@
         + ")"
         + dexMethod.method.proto.returnType.toDescriptorString();
   }
+
+  @Override
+  public MethodSubject toMethodOnCompanionClass() {
+    ClassSubject companionClass = clazz.toCompanionClass();
+    MethodReference reference = asMethodReference();
+    List<String> p =
+        ImmutableList.<String>builder()
+            .add(clazz.getFinalName())
+            .addAll(reference.getFormalTypes().stream().map(TypeReference::getTypeName).iterator())
+            .build();
+    return companionClass.method(
+        reference.getReturnType().getTypeName(),
+        DEFAULT_METHOD_PREFIX + reference.getMethodName(),
+        p);
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
index 949903d..5842c9b 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
@@ -123,7 +123,7 @@
     };
   }
 
-  public static Matcher<Subject> isRenamed() {
+  public static Matcher<Subject> isPresentAndRenamed() {
     return new TypeSafeMatcher<Subject>() {
       @Override
       protected boolean matchesSafely(Subject subject) {
@@ -143,7 +143,7 @@
     };
   }
 
-  public static Matcher<Subject> isNotRenamed() {
+  public static Matcher<Subject> isPresentAndNotRenamed() {
     return new TypeSafeMatcher<Subject>() {
       @Override
       protected boolean matchesSafely(Subject subject) {
@@ -163,8 +163,8 @@
     };
   }
 
-  public static Matcher<Subject> isRenamed(boolean isRenamed) {
-    return isRenamed ? isRenamed() : isNotRenamed();
+  public static Matcher<Subject> isPresentAndRenamed(boolean isRenamed) {
+    return isRenamed ? isPresentAndRenamed() : isPresentAndNotRenamed();
   }
 
   public static Matcher<MemberSubject> isStatic() {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
index 8fc439f..690838d 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
@@ -102,4 +102,6 @@
   }
 
   public abstract String getJvmMethodSignatureAsString();
+
+  public abstract MethodSubject toMethodOnCompanionClass();
 }
diff --git a/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java b/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
index fe98a17..8d6dd4b 100644
--- a/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
@@ -661,6 +661,10 @@
     }
   }
 
+  public CodeInspector codeInspector() {
+    return inspector;
+  }
+
   public Set<GraphNode> getRoots() {
     return Collections.unmodifiableSet(roots);
   }
diff --git a/third_party/proguard/README.google b/third_party/proguard/README.google
index abe0568..714899c 100644
--- a/third_party/proguard/README.google
+++ b/third_party/proguard/README.google
@@ -1,8 +1,9 @@
 URL: https://sourceforge.net/projects/proguard/files/proguard/5.2/
 URL: https://sourceforge.net/projects/proguard/files/proguard/6.0/
-Version: 5.2.1, 6.0.1
+URL: https://github.com/Guardsquare/proguard/releases/download/v7.0.0/proguard-7.0.0.tar.gz
+Version: 5.2.1, 6.0.1, 7.0.0
 License: GPL
-License File: proguard5.2.1/docs/license.html, proguard6.0.1/docs/license.html
+License File: proguard5.2.1/docs/license.html, proguard6.0.1/docs/license.html, proguard-7.0.0/docs/license.md
 
 Description:
 ProGuard Java Optimizer and Obfuscator
diff --git a/third_party/proguard/proguard-7.0.0.tar.gz.sha1 b/third_party/proguard/proguard-7.0.0.tar.gz.sha1
new file mode 100644
index 0000000..eb88ebe
--- /dev/null
+++ b/third_party/proguard/proguard-7.0.0.tar.gz.sha1
@@ -0,0 +1 @@
+96b54d82acbf8ccdf53fdc5ea95f65907e526fca
\ No newline at end of file
diff --git a/tools/keeprule_benchmark.py b/tools/keeprule_benchmark.py
new file mode 100755
index 0000000..0a7e063
--- /dev/null
+++ b/tools/keeprule_benchmark.py
@@ -0,0 +1,247 @@
+#!/usr/bin/env python
+# Copyright (c) 2020, 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.
+
+import argparse
+import os
+import subprocess
+import sys
+import time
+
+import jdk
+import proguard
+import toolhelper
+import utils
+
+SHRINKERS = ['r8'] + proguard.getVersions()
+
+INPUT_PROGRAM = utils.PINNED_R8_JAR
+
+ANNO = 'com.android.tools.r8.com.google.common.annotations.VisibleForTesting'
+
+R8_OPTIONS = [
+  'printTimes',
+  'passthroughDexCode',
+  'enableClassMerging',
+  'enableDevirtualization',
+  'enableNonNullTracking',
+  'enableInlining',
+  'enableSwitchMapRemoval',
+  'enableValuePropagation',
+  'useSmaliSyntax',
+  'verbose',
+  'quiet',
+  'invalidDebugInfoFatal',
+  'intermediate',
+  'enableLambdaMerging',
+  'enableDesugaring',
+  'enableMainDexListCheck',
+  'enableTreeShaking',
+  'printCfg',
+  'ignoreMissingClasses',
+  'forceProguardCompatibility',
+  'enableMinification',
+  'disableAssertions',
+  'debugKeepRules',
+  'debug',
+  'minimalMainDex',
+  'skipReadingDexCode',
+]
+
+R8_CLASSES = [
+  'com.android.tools.r8.code.Format11x',
+  'com.android.tools.r8.code.MoveFrom16',
+  'com.android.tools.r8.code.AddLong2Addr',
+  'com.android.tools.r8.code.AgetByte',
+  'com.android.tools.r8.code.SubDouble',
+  'com.android.tools.r8.code.Sput',
+  'com.android.tools.r8.code.Format10x',
+  'com.android.tools.r8.code.RemInt',
+  'com.android.tools.r8.code.ConstWide',
+  'com.android.tools.r8.code.SgetWide',
+  'com.android.tools.r8.code.OrInt2Addr',
+  'com.android.tools.r8.code.Iget',
+  'com.android.tools.r8.code.Instruction',
+  'com.android.tools.r8.code.SubInt2Addr',
+  'com.android.tools.r8.code.SwitchPayload',
+  'com.android.tools.r8.code.Const4',
+  'com.android.tools.r8.code.ShrIntLit8',
+  'com.android.tools.r8.code.ConstWide16',
+  'com.android.tools.r8.code.NegInt',
+  'com.android.tools.r8.code.SgetBoolean',
+  'com.android.tools.r8.code.Format22x',
+  'com.android.tools.r8.code.InvokeVirtualRange',
+  'com.android.tools.r8.code.Format45cc',
+  'com.android.tools.r8.code.DivFloat2Addr',
+  'com.android.tools.r8.code.MulIntLit16',
+  'com.android.tools.r8.code.BytecodeStream',
+]
+
+KEEP_MAIN = \
+  '-keep class com.android.tools.r8.R8 { void main(java.lang.String[]); }'
+
+BENCHMARKS = [
+  # Baseline compile just keeps R8.main (implicitly kept for all benchmarks).
+  ('KeepBaseline', ''),
+
+  # Mirror default keep getters/setters, but independent of hierarchy.
+  ('KeepGetters',
+    '-keepclassmembers class * { *** get*(); }'),
+  ('KeepGettersIf',
+    '-if class * { *** get*(); } -keep class <1> { *** get<2>(); }'),
+
+  # Mirror default keep getters/setters below View (here a class with a B).
+  ('KeepSubGetters',
+    '-keepclassmembers class * extends **.*B* { *** get*(); }'),
+  ('KeepSubGettersIf',
+    '-if class * extends **.*B* -keep class <1> { *** get*(); }'),
+
+  # General keep rule to keep annotated members.
+  ('KeepAnnoMethod',
+    '-keepclasseswithmembers class * { @%s *** *(...); }' % ANNO),
+  ('KeepAnnoMethodCond',
+    '-keepclassmembers class * { @%s *** *(...); }' % ANNO),
+  ('KeepAnnoMethodIf',
+    '-if class * { @%s *** *(...); } -keep class <1> { @%s *** <2>(...); }' \
+        % (ANNO, ANNO)),
+
+  # Large collection of rules mirroring AAPT conditional rules on R fields.
+  ('KeepAaptFieldIf',
+   '\n'.join([
+     '-if class **.InternalOptions { boolean %s; }'
+     ' -keep class %s { <init>(...); }' % (f, c)
+     for (f, c) in zip(R8_OPTIONS, R8_CLASSES) * 1 #100
+   ])),
+
+  # If rules with predicates that will never by true, but will need
+  # consideration. The CodeSize of these should be equal to the baseline run.
+  ('KeepIfNonExistingClass',
+   '-if class **.*A*B*C*D*E*F* -keep class %s' % ANNO),
+  ('KeepIfNonExistingMember',
+   '-if class **.*A* { *** *a*b*c*d*e*f*(...); } -keep class %s' % ANNO)
+]
+
+def parse_arguments(argv):
+  parser = argparse.ArgumentParser(
+                    description = 'Run keep-rule benchmarks.')
+  parser.add_argument('--golem',
+                    help = 'Link in third party dependencies.',
+                    default = False,
+                    action = 'store_true')
+  parser.add_argument('--ignore-java-version',
+                    help='Do not check java version',
+                    default=False,
+                    action='store_true')
+  parser.add_argument('--shrinker',
+                    help='The shrinker to use',
+                    choices=SHRINKERS,
+                    default=SHRINKERS[0])
+  parser.add_argument('--runs',
+                      help='Number of runs to average out time on',
+                      type=int,
+                      default=3)
+  parser.add_argument('--benchmark',
+                      help='Benchmark to run (default all)',
+                      choices=map(lambda (x,y): x, BENCHMARKS),
+                      default=None)
+  options = parser.parse_args(argv)
+  return options
+
+class BenchmarkResult:
+  def __init__(self, name, size, runs):
+    self.name = name
+    self.size = size
+    self.runs = runs
+
+def isPG(shrinker):
+  return proguard.isValidVersion(shrinker)
+
+def shrinker_args(shrinker, keepfile, output):
+  if shrinker == 'r8':
+    return [
+      jdk.GetJavaExecutable(),
+      '-cp', utils.R8LIB_JAR,
+      'com.android.tools.r8.R8',
+      INPUT_PROGRAM,
+      '--lib', utils.RT_JAR,
+      '--output', output,
+      '--min-api', '10000',
+      '--pg-conf', keepfile,
+      ]
+  elif isPG(shrinker):
+    return proguard.getCmd([
+      '-injars', INPUT_PROGRAM,
+      '-libraryjars', utils.RT_JAR,
+      '-outjars', output,
+      '-dontwarn', '**',
+      '-optimizationpasses', '2',
+      '@' + keepfile,
+    ],
+    version=shrinker)
+  else:
+    assert False, "Unexpected shrinker " + shrinker
+
+def dex(input, output):
+  toolhelper.run(
+      'd8',
+      [
+        input,
+        '--lib', utils.RT_JAR,
+        '--min-api', '10000',
+        '--output', output
+      ],
+      build=False,
+      debug=False)
+
+def run_shrinker(options, temp):
+  benchmarks = BENCHMARKS
+  if options.benchmark:
+    for (name, rules) in BENCHMARKS:
+      if name == options.benchmark:
+        benchmarks = [(name, rules)]
+        break
+    assert len(benchmarks) == 1, "Unexpected benchmark " + options.benchmark
+
+  run_count = options.runs
+  benchmark_results = []
+  for (name, rule) in benchmarks:
+    benchmark_keep = os.path.join(temp, '%s-keep.txt' % name)
+    with open(benchmark_keep, 'w') as fp:
+      fp.write(KEEP_MAIN)
+      fp.write('\n')
+      fp.write(rule)
+
+    benchmark_runs = []
+    benchmark_size = 0
+    for i in range(run_count):
+      out = os.path.join(temp, '%s-out%d.jar' % (name, i))
+      cmd = shrinker_args(options.shrinker, benchmark_keep, out)
+      utils.PrintCmd(cmd)
+      t0 = time.time()
+      subprocess.check_output(cmd)
+      t1 = time.time()
+      benchmark_runs.append(t1 - t0)
+      if isPG(options.shrinker):
+        dexout = os.path.join(temp, '%s-out%d-dex.jar' % (name, i))
+        dex(out, dexout)
+        benchmark_size = utils.uncompressed_size(dexout)
+      else:
+        benchmark_size = utils.uncompressed_size(out)
+    benchmark_results.append(
+        BenchmarkResult(name, benchmark_size, benchmark_runs))
+
+  print 'Runs:', options.runs
+  for result in benchmark_results:
+    benchmark_avg = sum(result.runs) / run_count
+    print '%s(CodeSize): %d' % (result.name, result.size)
+    print '%s(RunTimeRaw): %d ms' % (result.name, 1000.0 * benchmark_avg)
+
+if __name__ == '__main__':
+  options = parse_arguments(sys.argv[1:])
+  if options.golem:
+    golem.link_third_party()
+  if not options.ignore_java_version:
+    utils.check_java_version()
+  with utils.TempDir() as temp:
+    run_shrinker(options, temp)
diff --git a/tools/proguard.py b/tools/proguard.py
index b1bde54..5984622 100755
--- a/tools/proguard.py
+++ b/tools/proguard.py
@@ -6,22 +6,65 @@
 # Run ProGuard, Google's internal version
 
 from __future__ import print_function
-import jdk
+
 import os
 import subprocess
 import sys
+from exceptions import ValueError
 
+import jdk
 import utils
 
-PROGUARD_JAR = os.path.join(utils.REPO_ROOT, 'third_party', 'proguard',
-    'proguard_internal_159423826', 'ProGuard_deploy.jar')
+# Internal constants, these should not be used outside this script.
+# Use the friendly utility methods below.
+PG_DIR = os.path.join(utils.THIRD_PARTY, 'proguard')
+DEFAULT = 'pg6'
+DEFAULT_ALIAS = 'pg'
+VERSIONS = {
+  'pg5': os.path.join(PG_DIR, 'proguard5.2.1', 'lib', 'proguard.jar'),
+  'pg6': os.path.join(PG_DIR, 'proguard6.0.1', 'lib', 'proguard.jar'),
+  'pg7': os.path.join(PG_DIR, 'proguard-7.0.0', 'lib', 'proguard.jar'),
+  'pg_internal': os.path.join(
+      PG_DIR, 'proguard_internal_159423826', 'ProGuard_deploy.jar'),
+}
+# Add alias for the default version.
+VERSIONS[DEFAULT_ALIAS] = VERSIONS[DEFAULT]
 
-def run(args, track_memory_file = None, stdout=None, stderr=None):
+# Get versions sorted (nice for argument lists)
+def getVersions():
+  versions = list(VERSIONS.keys())
+  versions.sort()
+  return versions
+
+def isValidVersion(version):
+  return version in VERSIONS
+
+def getValidatedVersion(version):
+  if not isValidVersion(version):
+    raise ValueError("Invalid PG version: '%s'" % version)
+  return version
+
+def getJar(version=DEFAULT):
+  return VERSIONS[getValidatedVersion(version)]
+
+def getRetraceJar(version=DEFAULT):
+  if version == 'pg_internal':
+    raise ValueError("No retrace in internal distribution")
+  return getJar().replace('proguard.jar', 'retrace.jar')
+
+def getCmd(args, version=DEFAULT, jvmArgs=None):
+  cmd = []
+  if jvmArgs:
+    cmd.extend(jvmArgs)
+  cmd.extend([jdk.GetJavaExecutable(), '-jar', getJar(version)])
+  cmd.extend(args)
+  return cmd
+
+def run(args, version=DEFAULT, track_memory_file=None, stdout=None, stderr=None):
   cmd = []
   if track_memory_file:
     cmd.extend(['tools/track_memory.sh', track_memory_file])
-  cmd.extend([jdk.GetJavaExecutable(), '-jar', PROGUARD_JAR])
-  cmd.extend(args)
+  cmd.extend(getCmd(args, version))
   utils.PrintCmd(cmd)
   subprocess.call(cmd, stdout=stdout, stderr=stderr)
 
diff --git a/tools/r8_release.py b/tools/r8_release.py
index 1224b1d..0612c36 100755
--- a/tools/r8_release.py
+++ b/tools/r8_release.py
@@ -385,6 +385,77 @@
   return release_google3
 
 
+def update_desugar_library_in_studio(args):
+  assert os.path.exists(args.studio), ("Could not find STUDIO path %s"
+                                       % args.studio)
+
+  def make_release(args):
+    library_version = args.update_desugar_library_in_studio[0]
+    configuration_version = args.update_desugar_library_in_studio[1]
+    change_name = 'update-desugar-library-dependencies'
+
+    with utils.ChangedWorkingDirectory(args.studio):
+      if not args.use_existing_work_branch:
+        subprocess.call(['repo', 'abandon', change_name])
+      if not args.no_sync:
+        subprocess.check_call(['repo', 'sync', '-cq', '-j', '16'])
+
+      cmd = ['tools/base/bazel/bazel',
+         'run',
+         '//tools/base/bazel:add_dependency',
+         '--',
+         '--repo=https://maven.google.com com.android.tools:desugar_jdk_libs:%s' % library_version]
+      utils.PrintCmd(cmd)
+      subprocess.check_call(" ".join(cmd), shell=True)
+      cmd = ['tools/base/bazel/bazel', 'shutdown']
+      utils.PrintCmd(cmd)
+      subprocess.check_call(cmd)
+
+    prebuilts_tools = os.path.join(args.studio, 'prebuilts', 'tools')
+    with utils.ChangedWorkingDirectory(prebuilts_tools):
+      if not args.use_existing_work_branch:
+        with utils.ChangedWorkingDirectory(prebuilts_tools):
+          subprocess.check_call(['repo', 'start', change_name])
+      m2_dir = os.path.join(
+        'common', 'm2', 'repository', 'com', 'android', 'tools')
+      subprocess.check_call(
+        ['git',
+         'add',
+         os.path.join(m2_dir, DESUGAR_JDK_LIBS, library_version)])
+      subprocess.check_call(
+        ['git',
+         'add',
+         os.path.join(
+           m2_dir, DESUGAR_JDK_LIBS_CONFIGURATION, configuration_version)])
+
+      git_message = ("""Update library desugaring dependencies
+
+  com.android.tools:desugar_jdk_libs:%s
+  com.android.tools:desugar_jdk_libs_configuration:%s
+
+Bug: %s
+Test: L8ToolTest, L8DexDesugarTest"""
+                     % (library_version,
+                        configuration_version,
+                        '\nBug: '.join(args.bug)))
+
+      if not args.use_existing_work_branch:
+        subprocess.check_call(['git', 'commit', '-a', '-m', git_message])
+      else:
+        print ('Not committing when --use-existing-work-branch. '
+            + 'Commit message should be:\n\n'
+            + git_message
+            + '\n')
+      # Don't upload if requested not to, or if changes are not committed due
+      # to --use-existing-work-branch
+      if not args.no_upload and not args.use_existing_work_branch:
+        process = subprocess.Popen(['repo', 'upload', '.', '--verify'],
+                                   stdin=subprocess.PIPE)
+        return process.communicate(input='y\n')[0]
+
+  return make_release
+
+
 def prepare_desugar_library(args):
 
   def make_release(args):
@@ -677,6 +748,10 @@
                       nargs=2,
                       metavar=('<version>', '<configuration hash>'),
                       help='The new version of com.android.tools:desugar_jdk_libs')
+  group.add_argument('--update-desugar-library-in-studio',
+                      nargs=2,
+                      metavar=('<version>', '<configuration version>'),
+                      help='Update studio mirror of com.android.tools:desugar_jdk_libs')
   group.add_argument('--new-dev-branch',
                       nargs=2,
                       metavar=('<version>', '<master hash>'),
@@ -772,7 +847,7 @@
 
   if args.google3:
     targets_to_run.append(prepare_google3(args))
-  if args.studio:
+  if args.studio and not args.update_desugar_library_in_studio:
     targets_to_run.append(prepare_studio(args))
   if args.aosp:
     targets_to_run.append(prepare_aosp(args))
@@ -782,6 +857,16 @@
   if args.desugar_library:
     targets_to_run.append(prepare_desugar_library(args))
 
+  if args.update_desugar_library_in_studio:
+    if not args.studio:
+      print ("--studio required")
+      sys.exit(1)
+    if args.bug == []:
+      print ("Update studio mirror of com.android.tools:desugar_jdk_libs "
+             + "requires at least one bug by using '--bug'")
+      sys.exit(1)
+    targets_to_run.append(update_desugar_library_in_studio(args))
+
   final_results = []
   for target_closure in targets_to_run:
     final_results.append(target_closure(args))
diff --git a/tools/r8lib_size_compare.py b/tools/r8lib_size_compare.py
index 84dd1a2..568f254 100755
--- a/tools/r8lib_size_compare.py
+++ b/tools/r8lib_size_compare.py
@@ -73,13 +73,17 @@
 
   if not is_output_newer(utils.R8_JAR, r8lib_jar):
     r8lib_memory = os.path.join(tmpdir, 'r8lib%s-memory.txt' % inline_suffix)
+    # TODO(b/160420801): The signature of build_r8lib has changed.
     build_r8lib.build_r8lib(
-        output_path=r8lib_jar, output_map=r8lib_map,
-        extra_args=r8lib_args, track_memory_file=r8lib_memory)
+        output_path=r8lib_jar,
+        output_map=r8lib_map,
+        extra_args=r8lib_args,
+        track_memory_file=r8lib_memory)
 
   pg_output = os.path.join(tmpdir, 'r8lib-pg%s.jar' % inline_suffix)
   pg_memory = os.path.join(tmpdir, 'r8lib-pg%s-memory.txt' % inline_suffix)
   pg_map = os.path.join(tmpdir, 'r8lib-pg%s-map.txt' % inline_suffix)
+  # TODO(b/160420801): This must use proguard.* utils once working again.
   pg_args = ['tools/track_memory.sh', pg_memory,
              'third_party/proguard/proguard6.0.2/bin/proguard.sh',
              '@' + pg_config,
diff --git a/tools/retrace_benchmark.py b/tools/retrace_benchmark.py
index 21bb738..a819ea5 100755
--- a/tools/retrace_benchmark.py
+++ b/tools/retrace_benchmark.py
@@ -4,13 +4,14 @@
 # BSD-style license that can be found in the LICENSE file.
 
 import argparse
-import jdk
-import golem
 import os
 import subprocess
 import sys
 import time
-import toolhelper
+
+import golem
+import jdk
+import proguard
 import utils
 
 RETRACERS = ['r8', 'proguard', 'remapper']
@@ -44,13 +45,7 @@
     retracer_args = [
         '-cp', utils.R8LIB_JAR, 'com.android.tools.r8.retrace.Retrace']
   elif options.retracer == 'proguard':
-    retracer_args = ['-jar',
-                     os.path.join(
-                        utils.THIRD_PARTY,
-                        'proguard',
-                        'proguard6.0.1',
-                        'lib',
-                        'retrace.jar')]
+    retracer_args = ['-jar', proguard.getRetraceJar()]
   elif options.retracer == 'remapper':
     retracer_args = ['-jar',
                      os.path.join(
diff --git a/tools/run_proguard_dx_on_app.py b/tools/run_proguard_dx_on_app.py
index 61ac1d7..bb1d72a 100755
--- a/tools/run_proguard_dx_on_app.py
+++ b/tools/run_proguard_dx_on_app.py
@@ -120,6 +120,7 @@
       track_memory_file = join(temp, utils.MEMORY_USE_TMP_FILE)
     proguard.run(
         args,
+        version='pg_internal',
         track_memory_file = track_memory_file,
         stdout=open(os.devnull, 'w'))
     if options.print_memoryuse:
diff --git a/tools/test_helloexample.py b/tools/test_helloexample.py
index abda493..f81e64c 100755
--- a/tools/test_helloexample.py
+++ b/tools/test_helloexample.py
@@ -19,6 +19,7 @@
 
 import golem
 import jdk
+import proguard
 import utils
 
 HELLO_JAR = os.path.join(utils.BUILD, 'test', 'examples', 'hello.jar')
@@ -87,7 +88,7 @@
   parser = argparse.ArgumentParser(
       description = 'Compile a hello world example program')
   parser.add_argument('--tool',
-                      choices = ['d8', 'r8', 'pg'],
+                      choices = ['d8', 'r8'] + proguard.getVersions(),
                       required = True,
                       help = 'Compiler tool to use.')
   parser.add_argument('--output-mode',
@@ -163,19 +164,17 @@
     if output_mode == 'cf':
       cmd.append('--classfile')
     return [cmd]
-  if tool == 'pg':
+  if proguard.isValidVersion(tool):
     # Build PG invokation with additional rules to silence warnings.
     pg_out = output if output_mode == 'cf' \
       else os.path.join(output_dir, 'pgout.zip')
-    cmds = [[
-      jdk.GetJavaExecutable(),
-      '-jar', utils.PROGUARD_JAR,
+    cmds = [proguard.getCmd([
       '-injars', ':'.join([HELLO_JAR] + extra),
       '-libraryjars', lib,
       '-outjars', pg_out,
       '-dontwarn **',
       '@' + rules_file
-    ]]
+    ], version=tool)]
     if output_mode == 'dex':
       cmds.append(
           GetCompilerPrefix('d8', 'dex', output, pg_out, lib, [], noopt))
diff --git a/tools/utils.py b/tools/utils.py
index 16a0696..4a171ad 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -61,12 +61,6 @@
 GENERATED_LICENSE = os.path.join(GENERATED_LICENSE_DIR, 'LICENSE')
 RT_JAR = os.path.join(REPO_ROOT, 'third_party/openjdk/openjdk-rt-1.8/rt.jar')
 R8LIB_KEEP_RULES = os.path.join(REPO_ROOT, 'src/main/keep.txt')
-PROGUARD_JAR = os.path.join(
-    THIRD_PARTY,
-    'proguard',
-    'proguard6.0.1',
-    'lib',
-    'proguard.jar')
 CF_SEGMENTS_TOOL = os.path.join(THIRD_PARTY, 'cf_segments')
 PINNED_R8_JAR = os.path.join(REPO_ROOT, 'third_party/r8/r8.jar')
 PINNED_PGR8_JAR = os.path.join(REPO_ROOT, 'third_party/r8/r8-pg6.0.1.jar')
