diff --git a/src/test/java/com/android/tools/r8/graph/MissingClassThrowingTest.java b/src/test/java/com/android/tools/r8/graph/MissingClassThrowingTest.java
index 52c6e15..14cf693 100644
--- a/src/test/java/com/android/tools/r8/graph/MissingClassThrowingTest.java
+++ b/src/test/java/com/android/tools/r8/graph/MissingClassThrowingTest.java
@@ -61,7 +61,7 @@
   }
 
   @Test
-  public void testSuperTypeOfExceptions() {
+  public void testSuperTypeOfExceptions() throws Exception {
     AssertUtils.assertFailsCompilation(
         () ->
             testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldTypeStrengtheningCollisionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldTypeStrengtheningCollisionTest.java
new file mode 100644
index 0000000..b79fb5c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldTypeStrengtheningCollisionTest.java
@@ -0,0 +1,84 @@
+// Copyright (c) 2022, 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.ir.optimize.membervaluepropagation.fields;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.transformers.ClassFileTransformer.FieldPredicate;
+import com.android.tools.r8.utils.codeinspector.AssertUtils;
+import java.io.IOException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class FieldTypeStrengtheningCollisionTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection parameters() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void test() throws Exception {
+    AssertUtils.assertFailsCompilation(
+        () ->
+            testForR8(parameters.getBackend())
+                .addProgramClasses(A.class)
+                .addProgramClassFileData(getTransformedMain())
+                .addKeepMainRule(Main.class)
+                .addKeepRules(
+                    "-keep class "
+                        + Main.class.getTypeName()
+                        + " { "
+                        + A.class.getTypeName()
+                        + " f; }")
+                .enableInliningAnnotations()
+                .setMinApi(parameters.getApiLevel())
+                .compile());
+  }
+
+  private static byte[] getTransformedMain() throws IOException {
+    return transformer(Main.class).renameField(FieldPredicate.onName("f1"), "f").transform();
+  }
+
+  static class Main {
+
+    // @Keep
+    static A f1; // renamed to f
+
+    static Object f;
+
+    public static void main(String[] args) {
+      setField();
+      printField();
+    }
+
+    @NeverInline
+    static void setField() {
+      f = new A();
+    }
+
+    @NeverInline
+    static void printField() {
+      System.out.println(f);
+    }
+  }
+
+  public static class A {
+
+    @Override
+    public String toString() {
+      return "A";
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
index 174e734..e7e5ed0 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
@@ -15,7 +15,7 @@
 
 public class AssertUtils {
 
-  public static void assertFailsCompilation(ThrowingAction<CompilationFailedException> action) {
+  public static void assertFailsCompilation(ThrowingAction<Exception> action) throws Exception {
     try {
       assertFailsCompilationIf(true, action);
       return;
