diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceSynthesizedInnerFrameTest.java b/src/test/java/com/android/tools/r8/retrace/RetraceSynthesizedInnerFrameTest.java
new file mode 100644
index 0000000..bef6b13
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceSynthesizedInnerFrameTest.java
@@ -0,0 +1,67 @@
+// 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.retrace;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.references.Reference;
+import java.util.List;
+import java.util.OptionalInt;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class RetraceSynthesizedInnerFrameTest extends TestBase {
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public RetraceSynthesizedInnerFrameTest(TestParameters parameters) {
+    parameters.assertNoneRuntime();
+  }
+
+  private static final String mapping =
+      "# { id: 'com.android.tools.r8.mapping', version: '1.0' }\n"
+          + "some.Class -> a:\n"
+          + "  3:3:int other.strawberry(int):101:101 -> a\n"
+          + "  # { id: 'com.android.tools.r8.synthesized' }\n"
+          + "  3:3:int mango(float):28 -> a";
+
+  @Test
+  public void testSyntheticClass() {
+    List<RetraceFrameElement> frameResults =
+        Retracer.createDefault(ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+            .retraceClass(Reference.classFromTypeName("a"))
+            .stream()
+            .flatMap(
+                element ->
+                    element
+                        .lookupFrame(RetraceStackTraceContext.empty(), OptionalInt.of(3), "a")
+                        .stream())
+            .collect(Collectors.toList());
+    assertEquals(1, frameResults.size());
+    RetraceFrameElement retraceFrameElement = frameResults.get(0);
+    List<RetracedMethodReference> allFrames =
+        retraceFrameElement.stream()
+            .map(RetracedSingleFrame::getMethodReference)
+            .collect(Collectors.toList());
+    assertEquals(2, allFrames.size());
+    List<RetracedMethodReference> nonSyntheticFrames =
+        retraceFrameElement
+            .streamRewritten(RetraceStackTraceContext.empty())
+            .map(RetracedSingleFrame::getMethodReference)
+            .collect(Collectors.toList());
+    assertEquals(allFrames, nonSyntheticFrames);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java
deleted file mode 100644
index 1b10739..0000000
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2021, 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.retrace.api;
-
-import static org.junit.Assert.assertEquals;
-
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.RetraceFrameElement;
-import com.android.tools.r8.retrace.RetraceStackTraceContext;
-import com.android.tools.r8.retrace.RetracedMethodReference;
-import com.android.tools.r8.retrace.RetracedSingleFrame;
-import com.android.tools.r8.retrace.Retracer;
-import java.util.List;
-import java.util.OptionalInt;
-import java.util.stream.Collectors;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class RetraceApiSynthesizedInnerFrameTest extends RetraceApiTestBase {
-
-  public RetraceApiSynthesizedInnerFrameTest(TestParameters parameters) {
-    super(parameters);
-  }
-
-  @Override
-  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
-    return ApiTest.class;
-  }
-
-  public static class ApiTest implements RetraceApiBinaryTest {
-
-    private final String mapping =
-        "# { id: 'com.android.tools.r8.mapping', version: '1.0' }\n"
-            + "some.Class -> a:\n"
-            + "  3:3:int other.strawberry(int):101:101 -> a\n"
-            + "  # { id: 'com.android.tools.r8.synthesized' }\n"
-            + "  3:3:int mango(float):28 -> a";
-
-    @Test
-    public void testSyntheticClass() {
-      List<RetraceFrameElement> frameResults =
-          Retracer.createDefault(
-                  ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
-              .retraceClass(Reference.classFromTypeName("a"))
-              .stream()
-              .flatMap(
-                  element ->
-                      element
-                          .lookupFrame(RetraceStackTraceContext.empty(), OptionalInt.of(3), "a")
-                          .stream())
-              .collect(Collectors.toList());
-      assertEquals(1, frameResults.size());
-      RetraceFrameElement retraceFrameElement = frameResults.get(0);
-      List<RetracedMethodReference> allFrames =
-          retraceFrameElement.stream()
-              .map(RetracedSingleFrame::getMethodReference)
-              .collect(Collectors.toList());
-      assertEquals(2, allFrames.size());
-      List<RetracedMethodReference> nonSyntheticFrames =
-          retraceFrameElement
-              .streamRewritten(RetraceStackTraceContext.empty())
-              .map(RetracedSingleFrame::getMethodReference)
-              .collect(Collectors.toList());
-      assertEquals(allFrames, nonSyntheticFrames);
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
index 5b20d00..c233d49 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
@@ -28,7 +28,6 @@
           RetraceApiSynthesizedFieldTest.ApiTest.class,
           RetraceApiSynthesizedMethodTest.ApiTest.class,
           RetraceApiSynthesizedFrameTest.ApiTest.class,
-          RetraceApiSynthesizedInnerFrameTest.ApiTest.class,
           RetraceApiUnknownJsonTest.ApiTest.class,
           RetraceApiRewriteFrameInlineNpeTest.ApiTest.class,
           RetraceApiAmbiguousOriginalRangeTest.ApiTest.class,
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 5d61558..023f1c9 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-189692be996b34e4ba4a069c148b20d7ff99abe7
\ No newline at end of file
+ec4f1b68e126b5b5e8a53078c74c79c65e190cf2
\ No newline at end of file
