diff --git a/build.gradle b/build.gradle
index 4231129..b3846fb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -283,6 +283,7 @@
                 "proguard/proguard6.0.1",
                 "gradle/gradle",
                 "jdwp-tests",
+                "jacoco",
                 "jasmin",
                 "jctf",
                 "kotlin",
@@ -339,7 +340,6 @@
         "gmscore/gmscore_v9",
         "gmscore/gmscore_v10",
         "gmscore/latest",
-        "jacoco",
         "nest/nest_20180926_7c6cfb",
         "photos/2017-06-06",
         "youtube/youtube.android_12.10",
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 3dbaa56..4f26b86 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "1.4.2-dev";
+  public static final String LABEL = "1.4.3-dev";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index d83ad75..65d1e3a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -582,9 +582,7 @@
   //
   // See b/116683601 and b/116837585.
   public boolean canHaveThisJitCodeDebuggingBug() {
-    // TODO(b/116841249): Make this an actual min-sdk guard once we know that Art no longer crashes
-    // on these accesses.
-    return true;
+    return minApiLevel < AndroidApiLevel.Q.getLevel();
   }
 
   // The dalvik jit had a bug where the long operations add, sub, or, xor and and would write
diff --git a/src/test/java/com/android/tools/r8/TestRunResult.java b/src/test/java/com/android/tools/r8/TestRunResult.java
index 462ca1f..91c01c4 100644
--- a/src/test/java/com/android/tools/r8/TestRunResult.java
+++ b/src/test/java/com/android/tools/r8/TestRunResult.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
+import java.io.PrintStream;
 import java.util.concurrent.ExecutionException;
 
 public class TestRunResult {
@@ -47,22 +48,43 @@
 
   private String errorMessage(String message) {
     StringBuilder builder = new StringBuilder(message).append('\n');
-    printInfo(builder);
+    appendInfo(builder);
     return builder.toString();
   }
 
-  private void printInfo(StringBuilder builder) {
+  private void appendInfo(StringBuilder builder) {
     builder.append("APPLICATION: ");
-    printApplication(builder);
+    appendApplication(builder);
     builder.append('\n');
-    printProcessResult(builder);
+    appendProcessResult(builder);
   }
 
-  private void printApplication(StringBuilder builder) {
+  private void appendApplication(StringBuilder builder) {
     builder.append(app == null ? "<default>" : app.toString());
   }
 
-  private void printProcessResult(StringBuilder builder) {
+  private void appendProcessResult(StringBuilder builder) {
     builder.append("COMMAND: ").append(result.command).append('\n').append(result);
   }
+
+  public TestRunResult writeInfo(PrintStream ps) {
+    StringBuilder sb = new StringBuilder();
+    appendInfo(sb);
+    ps.println(sb.toString());
+    return this;
+  }
+
+  public TestRunResult writeApplicaion(PrintStream ps) {
+    StringBuilder sb = new StringBuilder();
+    appendApplication(sb);
+    ps.println(sb.toString());
+    return this;
+  }
+
+  public TestRunResult writeProcessResult(PrintStream ps) {
+    StringBuilder sb = new StringBuilder();
+    appendProcessResult(sb);
+    ps.println(sb.toString());
+    return this;
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index fa8ca13..4fa8738 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -761,7 +761,7 @@
     while (enclosing.getEnclosingClass() != null) {
       parts.set(parts.size() - 2, parts.get(parts.size() - 2) + "$" + parts.get(parts.size() - 1));
       parts.remove(parts.size() - 1);
-      enclosing = clazz.getEnclosingClass();
+      enclosing = enclosing.getEnclosingClass();
     }
     parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ".class");
     return parts;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
index b026c31..57ad556 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
@@ -58,9 +58,6 @@
   }
 }
 
-// TODO(b/110141157):
-// - Add tests where fields and methods get renamed due to naming conflicts.
-// - Add tests where the then-clause of an -if rule keeps a class that has been merged into another.
 @RunWith(Parameterized.class)
 public class IfRuleWithVerticalClassMerging extends TestBase {
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
index a877fec..7c85a7b 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
@@ -4,6 +4,16 @@
 
 package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
+
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
+
 public class MergedFieldTypeTest extends MergedTypeBaseTest {
 
   static class TestClass {
@@ -33,4 +43,69 @@
   public String getExpectedStdout() {
     return B.class.getName();
   }
+
+  public static class MergedFieldTypeWithCollisionTest extends MergedTypeBaseTest {
+
+    static class SuperTestClass {
+
+      private A field = new B();
+
+      public A get() {
+        return field;
+      }
+    }
+
+    static class TestClass extends SuperTestClass {
+
+      private A field = null;
+
+      public static void main(String[] args) {
+        TestClass obj = new TestClass();
+        if (false) {
+          obj.field = new B();
+          System.out.println(obj.field);
+        }
+        System.out.print(obj.get().getClass().getName());
+      }
+    }
+
+    public MergedFieldTypeWithCollisionTest(Backend backend, boolean enableVerticalClassMerging) {
+      super(backend, enableVerticalClassMerging, ImmutableList.of(SuperTestClass.class));
+    }
+
+    @Override
+    public Class<?> getTestClass() {
+      return TestClass.class;
+    }
+
+    @Override
+    public String getConditionForProguardIfRule() {
+      return "-if class **$SuperTestClass { **$A field; }";
+    }
+
+    @Override
+    public String getExpectedStdout() {
+      return B.class.getName();
+    }
+
+    @Override
+    public void inspect(CodeInspector inspector) {
+      super.inspect(inspector);
+
+      ClassSubject testClassSubject = inspector.clazz(TestClass.class);
+      assertThat(testClassSubject, isPresent());
+
+      if (enableVerticalClassMerging) {
+        // Verify that SuperTestClass has been merged into TestClass.
+        assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
+        assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+
+        // Verify that TestClass.field has been removed.
+        assertEquals(1, testClassSubject.allFields().size());
+
+        // Verify that there was a naming conflict such that SuperTestClass.field was renamed.
+        assertNotEquals("field", testClassSubject.allFields().get(0).getFinalName());
+      }
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
index 7447efd1..d8c1f29 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
@@ -4,6 +4,19 @@
 
 package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
+
+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.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class MergedParameterTypeTest extends MergedTypeBaseTest {
 
   static class TestClass {
@@ -35,4 +48,73 @@
   public String getExpectedStdout() {
     return B.class.getName();
   }
+
+  public static class MergedParameterTypeWithCollisionTest extends MergedTypeBaseTest {
+
+    static class SuperTestClass {
+
+      public static void method(A obj) {
+        System.out.print(obj.getClass().getName());
+      }
+    }
+
+    static class TestClass extends SuperTestClass {
+
+      public static void main(String[] args) {
+        B obj = new B();
+        if (obj == null) {
+          TestClass.method(obj);
+        }
+        SuperTestClass.method(obj);
+      }
+
+      public static void method(A obj) {
+        System.out.print(obj.getClass().getName());
+      }
+    }
+
+    public MergedParameterTypeWithCollisionTest(
+        Backend backend, boolean enableVerticalClassMerging) {
+      super(backend, enableVerticalClassMerging, ImmutableList.of(SuperTestClass.class));
+    }
+
+    @Override
+    public Class<?> getTestClass() {
+      return TestClass.class;
+    }
+
+    @Override
+    public String getConditionForProguardIfRule() {
+      return "-if class **$SuperTestClass { void method(**$A); }";
+    }
+
+    @Override
+    public String getExpectedStdout() {
+      return B.class.getName();
+    }
+
+    @Override
+    public void inspect(CodeInspector inspector) {
+      super.inspect(inspector);
+
+      ClassSubject testClassSubject = inspector.clazz(TestClass.class);
+      assertThat(testClassSubject, isPresent());
+
+      if (enableVerticalClassMerging) {
+        // Verify that SuperTestClass has been merged into TestClass.
+        assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
+        assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+
+        // Verify that TestClass.method has been removed.
+        List<FoundMethodSubject> methods =
+            testClassSubject.allMethods().stream()
+                .filter(subject -> subject.getFinalName().contains("method"))
+                .collect(Collectors.toList());
+        assertEquals(1, methods.size());
+
+        // Verify that there was a naming conflict such that SuperTestClass.method was renamed.
+        assertNotEquals("method", methods.get(0).getFinalName());
+      }
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
index da4a9f1..e1b071f 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
@@ -4,6 +4,19 @@
 
 package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
 
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
+
+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.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class MergedReturnTypeTest extends MergedTypeBaseTest {
 
   static class TestClass {
@@ -35,4 +48,72 @@
   public String getExpectedStdout() {
     return B.class.getName();
   }
+
+  public static class MergedReturnTypeWithCollisionTest extends MergedTypeBaseTest {
+
+    static class SuperTestClass {
+
+      public static A method() {
+        return new B();
+      }
+    }
+
+    static class TestClass extends SuperTestClass {
+
+      public static void main(String[] args) {
+        B obj = new B();
+        if (obj == null) {
+          System.out.print(TestClass.method().getClass().getName());
+        }
+        System.out.print(SuperTestClass.method().getClass().getName());
+      }
+
+      public static A method() {
+        return new B();
+      }
+    }
+
+    public MergedReturnTypeWithCollisionTest(Backend backend, boolean enableVerticalClassMerging) {
+      super(backend, enableVerticalClassMerging, ImmutableList.of(SuperTestClass.class));
+    }
+
+    @Override
+    public Class<?> getTestClass() {
+      return TestClass.class;
+    }
+
+    @Override
+    public String getConditionForProguardIfRule() {
+      return "-if class **$SuperTestClass { **$A method(); }";
+    }
+
+    @Override
+    public String getExpectedStdout() {
+      return B.class.getName();
+    }
+
+    @Override
+    public void inspect(CodeInspector inspector) {
+      super.inspect(inspector);
+
+      ClassSubject testClassSubject = inspector.clazz(TestClass.class);
+      assertThat(testClassSubject, isPresent());
+
+      if (enableVerticalClassMerging) {
+        // Verify that SuperTestClass has been merged into TestClass.
+        assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
+        assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+
+        // Verify that TestClass.method has been removed.
+        List<FoundMethodSubject> methods =
+            testClassSubject.allMethods().stream()
+                .filter(subject -> subject.getFinalName().contains("method"))
+                .collect(Collectors.toList());
+        assertEquals(1, methods.size());
+
+        // Verify that there was a naming conflict such that SuperTestClass.method was renamed.
+        assertNotEquals("method", methods.get(0).getFinalName());
+      }
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java
index ac341eb..2b9fec7 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java
@@ -27,10 +27,6 @@
 @RunWith(Parameterized.class)
 public abstract class MergedTypeBaseTest extends TestBase {
 
-  private final List<Class> CLASSES =
-      ImmutableList.of(
-          A.class, B.class, C.class, I.class, J.class, K.class, Unused.class, getTestClass());
-
   static class A {}
 
   static class B extends A {}
@@ -46,11 +42,22 @@
   static class Unused {}
 
   final Backend backend;
+  final List<Class> classes;
   final boolean enableVerticalClassMerging;
 
   public MergedTypeBaseTest(Backend backend, boolean enableVerticalClassMerging) {
+    this(backend, enableVerticalClassMerging, ImmutableList.of());
+  }
+
+  public MergedTypeBaseTest(
+      Backend backend, boolean enableVerticalClassMerging, List<Class<?>> additionalClasses) {
     this.backend = backend;
     this.enableVerticalClassMerging = enableVerticalClassMerging;
+    this.classes =
+        ImmutableList.<Class>builder()
+            .add(A.class, B.class, C.class, Unused.class, getTestClass())
+            .addAll(additionalClasses)
+            .build();
   }
 
   @Parameters(name = "Backend: {0}, vertical class merging: {1}")
@@ -96,7 +103,7 @@
             getConditionForProguardIfRule(),
             "-keep class " + Unused.class.getTypeName(),
             getAdditionalKeepRules());
-    AndroidApp output = compileWithR8(readClasses(CLASSES), config, this::configure, backend);
+    AndroidApp output = compileWithR8(readClasses(classes), config, this::configure, backend);
     assertEquals(expected, runOnVM(output, getTestClass(), backend));
     inspect(new CodeInspector(output));
   }
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 90013b0..e76991b 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
@@ -56,6 +56,12 @@
 
   public abstract void forAllFields(Consumer<FoundFieldSubject> inspection);
 
+  public final List<FoundFieldSubject> allFields() {
+    ImmutableList.Builder<FoundFieldSubject> builder = ImmutableList.builder();
+    forAllFields(builder::add);
+    return builder.build();
+  }
+
   public abstract FieldSubject field(String type, String name);
 
   public FoundClassSubject asFoundClassSubject() {
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 1d308fc..ed71b96 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
@@ -20,7 +20,6 @@
 import com.android.tools.r8.naming.MemberNaming.Signature;
 import com.android.tools.r8.naming.signature.GenericSignatureParser;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.function.Consumer;
 
@@ -109,12 +108,6 @@
         inspection);
   }
 
-  public List<FoundFieldSubject> allFields() {
-    ImmutableList.Builder<FoundFieldSubject> builder = ImmutableList.builder();
-    forAllFields(builder::add);
-    return builder.build();
-  }
-
   @Override
   public FieldSubject field(String type, String name) {
     String obfuscatedType = codeInspector.getObfuscatedTypeName(type);
