diff --git a/src/test/examples/adaptclassstrings/Main.java b/src/test/examples/adaptclassstrings/Main.java
index 4cee1d5..0489ca4 100644
--- a/src/test/examples/adaptclassstrings/Main.java
+++ b/src/test/examples/adaptclassstrings/Main.java
@@ -5,6 +5,7 @@
 
 public class Main {
   public static void main(String[] args) throws Exception {
+    assert false;
     int f = 3;
     A a = new A(f);
     AA aa = new AA(f);
@@ -25,6 +26,7 @@
     assert a_foo.equals(c_to_a_foo);
 
     String cName = (String) Class.forName(C.ITSELF).getField("ITSELF").get(null);
-    assert cName.equals(A.OTHER);
+    boolean b = cName.equals(A.OTHER);
+    assert b;
   }
 }
diff --git a/src/test/examples/adaptclassstrings/keep-rules-3.txt b/src/test/examples/adaptclassstrings/keep-rules-3.txt
new file mode 100644
index 0000000..f853c46
--- /dev/null
+++ b/src/test/examples/adaptclassstrings/keep-rules-3.txt
@@ -0,0 +1,13 @@
+# Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Keep the application entry point. Get rid of everything that is not
+# reachable from there.
+-keep public class adaptclassstrings.Main {
+  public static void main(...);
+}
+
+-dontshrink
+
+-adaptclassstrings
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index d06809e..057c751 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -100,6 +100,7 @@
     Map<String, Consumer<CodeInspector>> inspections = new HashMap<>();
     inspections.put("adaptclassstrings:keep-rules-1.txt", IdentifierMinifierTest::test1_rule1);
     inspections.put("adaptclassstrings:keep-rules-2.txt", IdentifierMinifierTest::test1_rule2);
+    inspections.put("adaptclassstrings:keep-rules-3.txt", IdentifierMinifierTest::test1_rule3);
     inspections.put(
         "atomicfieldupdater:keep-rules.txt", IdentifierMinifierTest::test_atomicfieldupdater);
     inspections.put("forname:keep-rules.txt", IdentifierMinifierTest::test_forname);
@@ -107,7 +108,6 @@
     inspections.put("identifiernamestring:keep-rules-1.txt", IdentifierMinifierTest::test2_rule1);
     inspections.put("identifiernamestring:keep-rules-2.txt", IdentifierMinifierTest::test2_rule2);
     inspections.put("identifiernamestring:keep-rules-3.txt", IdentifierMinifierTest::test2_rule3);
-
     Collection<Object[]> parameters = NamingTestBase.createTests(tests, inspections);
 
     // Duplicate parameters for each backend.
@@ -126,36 +126,28 @@
 
   // Without -adaptclassstrings
   private static void test1_rule1(CodeInspector inspector) {
-    ClassSubject mainClass = inspector.clazz("adaptclassstrings.Main");
-    MethodSubject main = mainClass.method(CodeInspector.MAIN);
-    assertTrue(main instanceof FoundMethodSubject);
-    FoundMethodSubject foundMain = (FoundMethodSubject) main;
-    verifyPresenceOfConstString(foundMain);
-    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
-    assertEquals(4, renamedYetFoundIdentifierCount);
-
-    ClassSubject aClass = inspector.clazz("adaptclassstrings.A");
-    MethodSubject bar = aClass.method("void", "bar", ImmutableList.of());
-    assertTrue(bar instanceof FoundMethodSubject);
-    FoundMethodSubject foundBar = (FoundMethodSubject) bar;
-    verifyPresenceOfConstString(foundBar);
-    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundBar);
-    assertEquals(0, renamedYetFoundIdentifierCount);
-
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, aClass.getDexClass().staticFields());
-    assertEquals(0, renamedYetFoundIdentifierCount);
+    test1_rules(inspector, 4, 0, 0);
   }
 
   // With -adaptclassstrings *.*A
   private static void test1_rule2(CodeInspector inspector) {
+    test1_rules(inspector, 4, 1, 1);
+  }
+
+  // With -adaptclassstrings (no filter)
+  private static void test1_rule3(CodeInspector inspector) {
+    test1_rules(inspector, 5, 1, 1);
+  }
+
+  private static void test1_rules(
+      CodeInspector inspector, int countInMain, int countInABar, int countInAFields) {
     ClassSubject mainClass = inspector.clazz("adaptclassstrings.Main");
     MethodSubject main = mainClass.method(CodeInspector.MAIN);
     assertTrue(main instanceof FoundMethodSubject);
     FoundMethodSubject foundMain = (FoundMethodSubject) main;
     verifyPresenceOfConstString(foundMain);
     int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
-    assertEquals(4, renamedYetFoundIdentifierCount);
+    assertEquals(countInMain, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("adaptclassstrings.A");
     MethodSubject bar = aClass.method("void", "bar", ImmutableList.of());
@@ -163,11 +155,11 @@
     FoundMethodSubject foundBar = (FoundMethodSubject) bar;
     verifyPresenceOfConstString(foundBar);
     renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundBar);
-    assertEquals(1, renamedYetFoundIdentifierCount);
+    assertEquals(countInABar, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
         countRenamedClassIdentifier(inspector, aClass.getDexClass().staticFields());
-    assertEquals(1, renamedYetFoundIdentifierCount);
+    assertEquals(countInAFields, renamedYetFoundIdentifierCount);
   }
 
   private static void test_atomicfieldupdater(CodeInspector inspector) {
