diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/ClassesHaveBeenMergedTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/ClassesHaveBeenMergedTest.java
index f22226d..6c5c68b 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/ClassesHaveBeenMergedTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/ClassesHaveBeenMergedTest.java
@@ -48,11 +48,10 @@
   }
 
   private void inspectVerticallyMergedClasses(VerticallyMergedClassesInspector inspector) {
-    inspector.assertMergedIntoSubtype(
-        GenericInterface.class,
-        GenericAbstractClass.class,
-        Outer.SuperClass.class,
-        SuperClass.class);
+    inspector
+        .assertMergedIntoSubtype(
+            GenericInterface.class, GenericAbstractClass.class, Outer.SuperClass.class)
+        .assertNoOtherClassesMerged();
   }
 
   private void inspect(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
index 723e674..ddd4825 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -249,80 +249,6 @@
   }
 
   @Test
-  public void testConflictInGeneratedName() throws Throwable {
-    String main = "classmerging.ConflictInGeneratedNameTest";
-    Path[] programFiles =
-        new Path[] {
-          CF_DIR.resolve("NeverPropagateValue.class"),
-          CF_DIR.resolve("NoAccessModification.class"),
-          CF_DIR.resolve("NoRedundantFieldLoadElimination.class"),
-          CF_DIR.resolve("ConflictInGeneratedNameTest.class"),
-          CF_DIR.resolve("ConflictInGeneratedNameTest$A.class"),
-          CF_DIR.resolve("ConflictInGeneratedNameTest$B.class")
-        };
-    Set<String> preservedClassNames =
-        ImmutableSet.of(
-            "classmerging.ConflictInGeneratedNameTest",
-            "classmerging.ConflictInGeneratedNameTest$B");
-    CodeInspector inspector =
-        runTestOnInput(
-                testForR8(parameters.getBackend())
-                    .addKeepRules(getProguardConfig(EXAMPLE_KEEP))
-                    .addOptionsModification(this::configure)
-                    .addOptionsModification(
-                        options ->
-                            options.getVerticalClassMergerOptions().setEnableBridgeAnalysis(false))
-                    .addOptionsModification(InlinerOptions::disableInlining)
-                    .allowUnusedProguardConfigurationRules(),
-                main,
-                readProgramFiles(programFiles),
-                preservedClassNames::contains,
-                // Disable debug testing since the test has a method with "$classmerging$" in the
-                // name.
-                null)
-            .inspector();
-
-    ClassSubject clazzSubject = inspector.clazz("classmerging.ConflictInGeneratedNameTest$B");
-    assertThat(clazzSubject, isPresent());
-
-    String suffix = "$classmerging$ConflictInGeneratedNameTest$A";
-    List<String> EMPTY = ImmutableList.of();
-
-    // There should be three fields.
-    assertThat(clazzSubject.field("java.lang.String", "name"), isPresent());
-    assertThat(clazzSubject.field("java.lang.String", "name$" + "1"), isPresent());
-    assertThat(clazzSubject.field("java.lang.String", "name" + suffix), isPresent());
-
-    // The direct method "$r8$constructor$classmerging$ConflictInGeneratedNameTest$A" is processed
-    // after the method "<init>" is renamed to exactly that name. Therefore the conflict should have
-    // been resolved by appending [suffix] to it.
-    assertThat(
-        clazzSubject.method("void", "$r8$constructor" + suffix + suffix, EMPTY), isPresent());
-
-    // There should be two foo's.
-    assertThat(clazzSubject.method("void", "foo", EMPTY), isPresent());
-    assertThat(clazzSubject.method("void", "foo" + suffix, EMPTY), isPresent());
-
-    // There should be two bar's.
-    assertThat(clazzSubject.method("void", "bar", EMPTY), isPresent());
-    assertThat(clazzSubject.method("void", "bar" + suffix, EMPTY), isPresent());
-
-    // There should be three baz's.
-    assertThat(clazzSubject.method("void", "baz", EMPTY), isPresent());
-    assertThat(clazzSubject.method("void", "baz" + suffix, EMPTY), isPresent());
-    assertThat(clazzSubject.method("void", "baz" + suffix + "$1", EMPTY), isPresent());
-
-    // There should be three boo's.
-    assertThat(clazzSubject.method("void", "boo", EMPTY), isPresent());
-    assertThat(clazzSubject.method("void", "boo" + suffix, EMPTY), isPresent());
-    assertThat(clazzSubject.method("void", "boo" + suffix + "$1", EMPTY), isPresent());
-
-    // There should be two getName's.
-    assertThat(clazzSubject.method("java.lang.String", "getName", EMPTY), isPresent());
-    assertThat(clazzSubject.method("java.lang.String", "getName" + suffix, EMPTY), isPresent());
-  }
-
-  @Test
   public void testFieldCollision() throws Throwable {
     String main = "classmerging.FieldCollisionTest";
     Path[] programFiles =
