diff --git a/src/test/java/com/android/tools/r8/naming/b124357885/B124357885Test.java b/src/test/java/com/android/tools/r8/naming/b124357885/B124357885Test.java
index 18d0719..8757685 100644
--- a/src/test/java/com/android/tools/r8/naming/b124357885/B124357885Test.java
+++ b/src/test/java/com/android/tools/r8/naming/b124357885/B124357885Test.java
@@ -14,9 +14,11 @@
 
 import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.graph.DexAnnotationElement;
 import com.android.tools.r8.graph.DexValue;
 import com.android.tools.r8.graph.DexValue.DexValueArray;
+import com.android.tools.r8.shaking.ProguardKeepAttributes;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -25,20 +27,26 @@
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
+import java.util.List;
 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 B124357885Test extends TestBase {
-  public final boolean minification;
 
-  @Parameterized.Parameters(name = "Minification: {0}")
-  public static Boolean[] data() {
-    return BooleanUtils.values();
+  private final TestParameters parameters;
+  private final boolean minification;
+
+  @Parameters(name = "{0}, minification: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
   }
 
-  public B124357885Test(boolean minification) {
+  public B124357885Test(TestParameters parameters, boolean minification) {
+    this.parameters = parameters;
     this.minification = minification;
   }
 
@@ -69,11 +77,15 @@
   @Test
   public void test() throws Exception {
     R8TestCompileResult compileResult =
-        testForR8(Backend.DEX)
+        testForR8(parameters.getBackend())
             .addProgramClasses(Main.class, Service.class, Foo.class, FooImpl.class)
             .addKeepMainRule(Main.class)
-            .addKeepRules("-keepattributes Signature,InnerClasses,EnclosingMethod")
+            .addKeepAttributes(
+                ProguardKeepAttributes.SIGNATURE,
+                ProguardKeepAttributes.INNER_CLASSES,
+                ProguardKeepAttributes.ENCLOSING_METHOD)
             .minification(minification)
+            .setMinApi(parameters.getApiLevel())
             .compile()
             .inspect(
                 inspector -> {
@@ -88,31 +100,31 @@
                   checkSignatureAnnotation(inspector, signature);
                 });
 
-        String fooImplFinalName = compileResult.inspector().clazz(FooImpl.class).getFinalName();
+    String fooImplFinalName = compileResult.inspector().clazz(FooImpl.class).getFinalName();
 
-        compileResult
-            .run(Main.class)
-            .assertSuccessWithOutput(StringUtils.lines(fooImplFinalName, fooImplFinalName));
+    compileResult
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutput(StringUtils.lines(fooImplFinalName, fooImplFinalName));
   }
-}
 
-class Main {
-  public static void main(String... args) throws Exception {
-    Method method = Service.class.getMethod("fooList");
-    ParameterizedType type = (ParameterizedType) method.getGenericReturnType();
-    Class<?> rawType = (Class<?>) type.getRawType();
-    System.out.println(rawType.getName());
+  public static class Main {
+    public static void main(String... args) throws Exception {
+      Method method = Service.class.getMethod("fooList");
+      ParameterizedType type = (ParameterizedType) method.getGenericReturnType();
+      Class<?> rawType = (Class<?>) type.getRawType();
+      System.out.println(rawType.getName());
 
-    // Convince R8 we only use subtypes to get class merging of Foo into FooImpl.
-    Foo<String> foo = new FooImpl<>();
-    System.out.println(foo.getClass().getCanonicalName());
+      // Convince R8 we only use subtypes to get class merging of Foo into FooImpl.
+      Foo<String> foo = new FooImpl<>();
+      System.out.println(foo.getClass().getCanonicalName());
+    }
   }
+
+  interface Service {
+    Foo<String> fooList();
+  }
+
+  interface Foo<T> {}
+
+  public static class FooImpl<T> implements Foo<T> {}
 }
-
-interface Service {
-  Foo<String> fooList();
-}
-
-interface Foo<T> {}
-
-class FooImpl<T> implements Foo<T> {}
