diff --git a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/ArrayInterfaceArrayCheckCastTest.java b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/ArrayInterfaceArrayCheckCastTest.java
new file mode 100644
index 0000000..b643a2c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/ArrayInterfaceArrayCheckCastTest.java
@@ -0,0 +1,98 @@
+// 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.checkcast;
+
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+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.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class ArrayInterfaceArrayCheckCastTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> data() {
+    return buildParameters(getTestParameters().withAllRuntimes().withAllApiLevels().build());
+  }
+
+  private static final String EXPECTED_OUTPUT =
+      StringUtils.lines(
+          "class [[L" + Impl1.class.getTypeName() + ";",
+          "class [[L" + Impl1.class.getTypeName() + ";");
+
+  @Test
+  public void testD8() throws Exception {
+    assumeTrue(parameters.isDexRuntime());
+    testForD8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .addKeepRules("-keep class ** { *; }")
+        .setMinApi(parameters.getApiLevel())
+        .allowStdoutMessages()
+        .run(parameters.getRuntime(), TestClass.class)
+        .applyIf(
+            parameters.isCfRuntime(),
+            r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT),
+            r -> r.assertFailureWithErrorThatThrows(VerifyError.class));
+  }
+
+  // See b/223424356 (and basically the code back from b/69826014#comment3).
+  interface I {}
+
+  static class Impl1 implements I {}
+
+  static class Impl2 implements I {}
+
+  static class TestClass {
+
+    public static Impl1[][] getArrayOfImpl1() {
+      return new Impl1[][] {new Impl1[] {new Impl1()}};
+    }
+
+    public static Impl2[][] getArrayOfImpl2() {
+      return new Impl2[][] {new Impl2[] {new Impl2()}};
+    }
+
+    public static I[][] getArrayOfI(boolean b) {
+      if (b) {
+        return TestClass.getArrayOfImpl1();
+      } else {
+        return TestClass.getArrayOfImpl2();
+      }
+    }
+
+    public static I[][] getArrayOfIWithCast(boolean b) {
+      Object[] arrayOfI;
+      if (b) {
+        arrayOfI = TestClass.getArrayOfImpl1();
+      } else {
+        arrayOfI = TestClass.getArrayOfImpl2();
+      }
+      return (I[][]) arrayOfI;
+    }
+
+    public static void main(String[] args) {
+      System.out.println(getArrayOfIWithCast(args.length == 0).getClass());
+      System.out.println(getArrayOfI(args.length == 0).getClass());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/InterfaceArrayCheckCastTest.java b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/InterfaceArrayCheckCastTest.java
new file mode 100644
index 0000000..70f79da
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/InterfaceArrayCheckCastTest.java
@@ -0,0 +1,98 @@
+// 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.checkcast;
+
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+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.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class InterfaceArrayCheckCastTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> data() {
+    return buildParameters(getTestParameters().withAllRuntimes().withAllApiLevels().build());
+  }
+
+  private static final String EXPECTED_OUTPUT =
+      StringUtils.lines(
+          "class [L" + Impl1.class.getTypeName() + ";",
+          "class [L" + Impl1.class.getTypeName() + ";");
+
+  @Test
+  public void testD8() throws Exception {
+    assumeTrue(parameters.isDexRuntime());
+    testForD8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .addKeepRules("-keep class ** { *; }")
+        .setMinApi(parameters.getApiLevel())
+        .allowStdoutMessages()
+        .run(parameters.getRuntime(), TestClass.class)
+        .applyIf(
+            parameters.isCfRuntime(),
+            r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT),
+            r -> r.assertFailureWithErrorThatThrows(VerifyError.class));
+  }
+
+  // See b/223424356 (and basically the code back from b/69826014#comment3).
+  interface I {}
+
+  static class Impl1 implements I {}
+
+  static class Impl2 implements I {}
+
+  static class TestClass {
+
+    public static Impl1[] getArrayOfImpl1() {
+      return new Impl1[] {new Impl1()};
+    }
+
+    public static Impl2[] getArrayOfImpl2() {
+      return new Impl2[] {new Impl2()};
+    }
+
+    public static I[] getArrayOfI(boolean b) {
+      if (b) {
+        return TestClass.getArrayOfImpl1();
+      } else {
+        return TestClass.getArrayOfImpl2();
+      }
+    }
+
+    public static I[] getArrayOfIWithCast(boolean b) {
+      Object[] arrayOfI;
+      if (b) {
+        arrayOfI = TestClass.getArrayOfImpl1();
+      } else {
+        arrayOfI = TestClass.getArrayOfImpl2();
+      }
+      return (I[]) arrayOfI;
+    }
+
+    public static void main(String[] args) {
+      System.out.println(getArrayOfIWithCast(args.length == 0).getClass());
+      System.out.println(getArrayOfI(args.length == 0).getClass());
+    }
+  }
+}
