diff --git a/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationMatcher.java b/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationMatcher.java
index 0d7e1b2..ccac25a 100644
--- a/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationMatcher.java
+++ b/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationMatcher.java
@@ -239,32 +239,22 @@
         return;
       }
       KeepClassItemPattern classPattern = schema.classes.get(classIndex);
-      if (classPattern.getClassNamePattern().isExact()) {
-        DexType type =
-            appInfo
-                .dexItemFactory()
-                .createType(classPattern.getClassNamePattern().getExactDescriptor());
-        DexProgramClass clazz = DexProgramClass.asProgramClassOrNull(appInfo.definitionFor(type));
-        if (clazz == null) {
-          // No valid match, so the rule is discarded. This should likely be a diagnostics info.
-          return;
-        }
-        if (!predicates.matchesClass(clazz, classPattern)) {
-          // Invalid match for this class.
-          return;
-        }
-        continueWithClass(classIndex, clazz);
-      } else {
-        // TODO(b/323816623): This repeated iteration on all classes must be avoided.
-        for (DexProgramClass clazz : appInfo.classes()) {
-          if (predicates.matchesClass(clazz, classPattern)) {
-            continueWithClass(classIndex, clazz);
-          }
-        }
+      if (!classPattern.getClassNamePattern().isExact()) {
+        throw new Unimplemented();
       }
-    }
-
-    private void continueWithClass(int classIndex, DexProgramClass clazz) {
+      DexType type =
+          appInfo
+              .dexItemFactory()
+              .createType(classPattern.getClassNamePattern().getExactDescriptor());
+      DexProgramClass clazz = DexProgramClass.asProgramClassOrNull(appInfo.definitionFor(type));
+      if (clazz == null) {
+        // No valid match, so the rule is discarded. This should likely be a diagnostics info.
+        return;
+      }
+      if (!predicates.matchesClass(clazz, classPattern)) {
+        // Invalid match for this class.
+        return;
+      }
       assignment.setClass(classIndex, clazz);
       IntList classMemberIndexList = schema.classMembers.get(classIndex);
       findMatchingMember(0, classMemberIndexList, clazz, classIndex + 1);
@@ -280,55 +270,48 @@
         findMatchingClass(nextClassIndex);
         return;
       }
+      int nextMemberInHolderIndex = memberInHolderIndex + 1;
       int memberIndex = memberIndexTranslation.getInt(memberInHolderIndex);
       KeepMemberItemPattern memberItemPattern = schema.members.get(memberIndex);
-      Consumer<ProgramDefinition> continueWithMember =
-          m ->
-              continueWithMember(
-                  m, memberIndex, memberInHolderIndex + 1, memberIndexTranslation, nextClassIndex);
       memberItemPattern
           .getMemberPattern()
           .match(
-              generalMemberPattern -> {
-                if (!holder.hasMethodsOrFields() && generalMemberPattern.isAllMembers()) {
+              generalMember -> {
+                if (!holder.hasMethodsOrFields()) {
                   // The empty class can only match the "all member" pattern but with no assignment.
-                  continueWithMember.accept(holder);
-                } else {
-                  holder.forEachProgramMember(
-                      m -> {
-                        if (predicates.matchesGeneralMember(
-                            m.getDefinition(), generalMemberPattern)) {
-                          continueWithMember.accept(m);
-                        }
-                      });
+                  if (generalMember.isAllMembers()) {
+                    assignment.setEmptyMemberMatch(memberIndex);
+                    findMatchingMember(
+                        nextMemberInHolderIndex, memberIndexTranslation, holder, nextClassIndex);
+                  }
+                  return;
                 }
+                if (!generalMember.isAllMembers()) {
+                  throw new Unimplemented();
+                }
+                holder.forEachProgramMember(
+                    f -> {
+                      assignment.setMember(memberIndex, f);
+                      findMatchingMember(
+                          nextMemberInHolderIndex, memberIndexTranslation, holder, nextClassIndex);
+                    });
               },
-              fieldPattern ->
-                  holder.forEachProgramFieldMatching(
-                      f -> predicates.matchesField(f, fieldPattern), continueWithMember),
-              methodPattern ->
-                  holder.forEachProgramMethodMatching(
-                      m -> predicates.matchesMethod(m, methodPattern), continueWithMember));
-    }
-
-    private void continueWithMember(
-        ProgramDefinition definition,
-        int memberIndex,
-        int nextMemberInHolderIndex,
-        IntList memberIndexTranslation,
-        int nextClassIndex) {
-      if (definition.isProgramMember()) {
-        assignment.setMember(memberIndex, definition.asProgramMember());
-      } else {
-        assert definition.isProgramClass();
-        assert !definition.asProgramClass().hasMethodsOrFields();
-        assignment.setEmptyMemberMatch(memberIndex);
-      }
-      findMatchingMember(
-          nextMemberInHolderIndex,
-          memberIndexTranslation,
-          definition.getContextClass(),
-          nextClassIndex);
+              fieldMember -> {
+                throw new Unimplemented();
+              },
+              methodMember -> {
+                holder.forEachProgramMethod(
+                    m -> {
+                      if (predicates.matchesMethod(methodMember, m)) {
+                        assignment.setMember(memberIndex, m);
+                        findMatchingMember(
+                            nextMemberInHolderIndex,
+                            memberIndexTranslation,
+                            holder,
+                            nextClassIndex);
+                      }
+                    });
+              });
     }
   }
 
@@ -353,6 +336,24 @@
       this.edge = edge;
       edge.getPreconditions().forEach(this::addPrecondition);
       edge.getConsequences().forEachTarget(this::addConsequence);
+      ListUtils.forEachWithIndex(
+          members,
+          (member, memberIndex) -> {
+            member
+                .getClassReference()
+                .matchClassItemReference(
+                    bindingReference -> {
+                      int classIndex = symbolToKey.getInt(bindingReference);
+                      classMembers.get(classIndex).add(memberIndex);
+                    },
+                    classItemPattern -> {
+                      // The member declares its own inline class so link it directly.
+                      IntArrayList memberList = new IntArrayList();
+                      memberList.add(memberIndex);
+                      classes.add(classItemPattern);
+                      classMembers.add(memberList);
+                    });
+          });
     }
 
     public static boolean isClassKeyReference(int keyRef) {
@@ -392,17 +393,14 @@
 
     private int defineItemPattern(KeepItemPattern item) {
       if (item.isClassItemPattern()) {
-        int classIndex = classes.size();
+        int key = classes.size();
         classes.add(item.asClassItemPattern());
         classMembers.add(new IntArrayList());
-        return encodeClassKey(classIndex);
-      } else {
-        int classIndex = defineItemReference(item.asMemberItemPattern().getClassReference());
-        int memberIndex = members.size();
-        members.add(item.asMemberItemPattern());
-        classMembers.get(classIndex).add(memberIndex);
-        return encodeMemberKey(memberIndex);
+        return encodeClassKey(key);
       }
+      int key = members.size();
+      members.add(item.asMemberItemPattern());
+      return encodeMemberKey(key);
     }
 
     public void addPrecondition(KeepCondition condition) {
diff --git a/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationMatcherPredicates.java b/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationMatcherPredicates.java
index 364a17f..45e8385 100644
--- a/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationMatcherPredicates.java
+++ b/src/main/java/com/android/tools/r8/shaking/rules/KeepAnnotationMatcherPredicates.java
@@ -5,38 +5,25 @@
 package com.android.tools.r8.shaking.rules;
 
 import com.android.tools.r8.errors.Unimplemented;
-import com.android.tools.r8.graph.AccessFlags;
-import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexAnnotationSet;
-import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.DexEncodedMember;
-import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DexTypeList;
-import com.android.tools.r8.graph.FieldAccessFlags;
 import com.android.tools.r8.graph.MethodAccessFlags;
-import com.android.tools.r8.keepanno.ast.AccessVisibility;
+import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.keepanno.ast.KeepArrayTypePattern;
 import com.android.tools.r8.keepanno.ast.KeepClassItemPattern;
-import com.android.tools.r8.keepanno.ast.KeepFieldAccessPattern;
-import com.android.tools.r8.keepanno.ast.KeepFieldPattern;
 import com.android.tools.r8.keepanno.ast.KeepInstanceOfPattern;
-import com.android.tools.r8.keepanno.ast.KeepMemberAccessPattern;
-import com.android.tools.r8.keepanno.ast.KeepMemberPattern;
 import com.android.tools.r8.keepanno.ast.KeepMethodAccessPattern;
 import com.android.tools.r8.keepanno.ast.KeepMethodParametersPattern;
 import com.android.tools.r8.keepanno.ast.KeepMethodPattern;
 import com.android.tools.r8.keepanno.ast.KeepMethodReturnTypePattern;
-import com.android.tools.r8.keepanno.ast.KeepPackagePattern;
 import com.android.tools.r8.keepanno.ast.KeepPrimitiveTypePattern;
 import com.android.tools.r8.keepanno.ast.KeepQualifiedClassNamePattern;
 import com.android.tools.r8.keepanno.ast.KeepStringPattern;
 import com.android.tools.r8.keepanno.ast.KeepTypePattern;
-import com.android.tools.r8.keepanno.ast.KeepUnqualfiedClassNamePattern;
-import com.android.tools.r8.keepanno.ast.ModifierPattern;
 import com.android.tools.r8.keepanno.ast.OptionalPattern;
 import java.util.List;
 
@@ -61,25 +48,7 @@
     if (pattern.isExact()) {
       return type.toDescriptorString().equals(pattern.getExactDescriptor());
     }
-    return matchesPackage(type.getPackageName(), pattern.getPackagePattern())
-        && matchesSimpleName(type.getSimpleName(), pattern.getNamePattern());
-  }
-
-  private boolean matchesPackage(String packageName, KeepPackagePattern pattern) {
-    if (pattern.isAny()) {
-      return true;
-    }
-    if (pattern.isTop() && packageName.equals("")) {
-      return true;
-    }
-    return packageName.equals(pattern.getExactPackageAsString());
-  }
-
-  public boolean matchesSimpleName(String simpleName, KeepUnqualfiedClassNamePattern pattern) {
-    if (pattern.isAny()) {
-      return true;
-    }
-    return pattern.asExact().getExactNameAsString().equals(simpleName);
+    throw new Unimplemented();
   }
 
   private boolean matchesInstanceOfPattern(
@@ -90,109 +59,30 @@
     throw new Unimplemented();
   }
 
-  public boolean matchesGeneralMember(DexEncodedMember<?, ?> member, KeepMemberPattern pattern) {
-    assert pattern.isGeneralMember();
-    if (pattern.isAllMembers()) {
+  public boolean matchesMethod(KeepMethodPattern methodPattern, ProgramMethod method) {
+    if (methodPattern.isAnyMethod()) {
       return true;
     }
-    return matchesAnnotatedBy(member.annotations(), pattern.getAnnotatedByPattern())
-        && matchesGeneralMemberAccess(member.getAccessFlags(), pattern.getAccessPattern());
+    return matchesName(method.getName(), methodPattern.getNamePattern().asStringPattern())
+        && matchesReturnType(method.getReturnType(), methodPattern.getReturnTypePattern())
+        && matchesParameters(method.getParameters(), methodPattern.getParametersPattern())
+        && matchesAnnotatedBy(method.getAnnotations(), methodPattern.getAnnotatedByPattern())
+        && matchesAccess(method.getAccessFlags(), methodPattern.getAccessPattern());
   }
 
-  public boolean matchesMethod(DexEncodedMethod method, KeepMethodPattern pattern) {
-    if (pattern.isAnyMethod()) {
-      return true;
-    }
-    return matchesName(method.getName(), pattern.getNamePattern().asStringPattern())
-        && matchesReturnType(method.getReturnType(), pattern.getReturnTypePattern())
-        && matchesParameters(method.getParameters(), pattern.getParametersPattern())
-        && matchesAnnotatedBy(method.annotations(), pattern.getAnnotatedByPattern())
-        && matchesMethodAccess(method.getAccessFlags(), pattern.getAccessPattern());
-  }
-
-  public boolean matchesField(DexEncodedField field, KeepFieldPattern pattern) {
-    if (pattern.isAnyField()) {
-      return true;
-    }
-    return matchesName(field.getName(), pattern.getNamePattern().asStringPattern())
-        && matchesType(field.getType(), pattern.getTypePattern().asType())
-        && matchesAnnotatedBy(field.annotations(), pattern.getAnnotatedByPattern())
-        && matchesFieldAccess(field.getAccessFlags(), pattern.getAccessPattern());
-  }
-
-  public boolean matchesGeneralMemberAccess(
-      AccessFlags<?> access, KeepMemberAccessPattern pattern) {
+  public boolean matchesAccess(MethodAccessFlags access, KeepMethodAccessPattern pattern) {
     if (pattern.isAny()) {
       return true;
     }
-    if (!pattern.isAnyVisibility() && !pattern.isVisibilityAllowed(getAccessVisibility(access))) {
-      return false;
-    }
-    return matchesModifier(access.isStatic(), pattern.getStaticPattern())
-        && matchesModifier(access.isFinal(), pattern.getFinalPattern())
-        && matchesModifier(access.isSynthetic(), pattern.getSyntheticPattern());
-  }
-
-  public boolean matchesMethodAccess(MethodAccessFlags access, KeepMethodAccessPattern pattern) {
-    if (pattern.isAny()) {
-      return true;
-    }
-    return matchesGeneralMemberAccess(access, pattern)
-        && matchesModifier(access.isSynchronized(), pattern.getSynchronizedPattern())
-        && matchesModifier(access.isBridge(), pattern.getBridgePattern())
-        && matchesModifier(access.isNative(), pattern.getNativePattern())
-        && matchesModifier(access.isAbstract(), pattern.getAbstractPattern())
-        && matchesModifier(access.isStrict(), pattern.getStrictFpPattern());
-  }
-
-  public boolean matchesFieldAccess(FieldAccessFlags access, KeepFieldAccessPattern pattern) {
-    if (pattern.isAny()) {
-      return true;
-    }
-    return matchesGeneralMemberAccess(access, pattern)
-        && matchesModifier(access.isVolatile(), pattern.getVolatilePattern())
-        && matchesModifier(access.isTransient(), pattern.getTransientPattern());
-  }
-
-  private boolean matchesModifier(boolean value, ModifierPattern pattern) {
-    return pattern.isAny() || value == pattern.isOnlyPositive();
-  }
-
-  private AccessVisibility getAccessVisibility(AccessFlags<?> accessFlags) {
-    if (accessFlags.isPublic()) {
-      return AccessVisibility.PUBLIC;
-    }
-    if (accessFlags.isProtected()) {
-      return AccessVisibility.PROTECTED;
-    }
-    if (accessFlags.isPackagePrivate()) {
-      return AccessVisibility.PACKAGE_PRIVATE;
-    }
-    assert accessFlags.isPrivate();
-    return AccessVisibility.PRIVATE;
+    throw new Unimplemented();
   }
 
   public boolean matchesAnnotatedBy(
       DexAnnotationSet annotations, OptionalPattern<KeepQualifiedClassNamePattern> pattern) {
     if (pattern.isAbsent()) {
-      // No pattern for annotations matches regardless of annotation content.
       return true;
     }
-    if (annotations.isEmpty()) {
-      // Fast-path if pattern is present but no annotations.
-      return false;
-    }
-    KeepQualifiedClassNamePattern classNamePattern = pattern.get();
-    if (classNamePattern.isAny()) {
-      // Fast-path the "any" case.
-      return true;
-    }
-    for (DexAnnotation annotation : annotations.getAnnotations()) {
-      if (matchesClassName(annotation.getAnnotationType(), classNamePattern)) {
-        return true;
-      }
-    }
-    return false;
+    throw new Unimplemented();
   }
 
   public boolean matchesParameters(DexTypeList parameters, KeepMethodParametersPattern pattern) {
diff --git a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternAnyRetentionTest.java b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternAnyRetentionTest.java
index 2dd3af2..31de01d 100644
--- a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternAnyRetentionTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternAnyRetentionTest.java
@@ -44,7 +44,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternClassRetentionTest.java b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternClassRetentionTest.java
index af205e6..df1bee8 100644
--- a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternClassRetentionTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternClassRetentionTest.java
@@ -45,7 +45,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternMultipleTest.java b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternMultipleTest.java
index af1e3b0..feafc7f 100644
--- a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternMultipleTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternMultipleTest.java
@@ -46,7 +46,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/keepanno/ArrayPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/ArrayPatternsTest.java
index 86bf2a5..2f1f572 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ArrayPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ArrayPatternsTest.java
@@ -41,7 +41,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoPatternTest.java b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoPatternTest.java
index 5c7237a..7f3840f 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoPatternTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoPatternTest.java
@@ -44,7 +44,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByPatternsTest.java
index ea21a44..6d0f966 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByPatternsTest.java
@@ -44,7 +44,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/keepanno/FieldPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/FieldPatternsTest.java
index 61fb54c..669d945 100644
--- a/src/test/java/com/android/tools/r8/keepanno/FieldPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/FieldPatternsTest.java
@@ -38,7 +38,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .setExcludedOuterClass(getClass())
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
index 6e41cc0..a9dec7d 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
@@ -82,7 +82,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .allowAccessModification()
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index 5e34061..1105bd3 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -113,8 +113,8 @@
     return applyIfPG(b -> b.addDontWarn(clazz));
   }
 
-  public KeepAnnoTestBuilder allowUnusedProguardConfigurationRules() {
-    return this;
+  public final KeepAnnoTestBuilder allowUnusedProguardConfigurationRules() {
+    return applyIfR8Current(R8TestBuilder::allowUnusedProguardConfigurationRules);
   }
 
   public final KeepAnnoTestBuilder allowAccessModification() {
@@ -170,7 +170,6 @@
     private List<Consumer<R8TestCompileResult>> compileResultConsumers = new ArrayList<>();
     private final boolean normalizeEdges;
     private final boolean extractRules;
-    private boolean enableNative = false;
 
     private R8NativeBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
       super(params, temp);
@@ -190,25 +189,10 @@
     }
 
     @Override
-    public KeepAnnoTestBuilder allowUnusedProguardConfigurationRules() {
-      if (!enableNative) {
-        builder.allowUnusedProguardConfigurationRules();
-      }
-      return this;
-    }
-
-    @Override
     public KeepAnnoTestBuilder enableNativeInterpretation() {
       if (extractRules) {
         return this;
       }
-      enableNative = true;
-      // TODO(b/323816623): The compiler assumes that this is known prior to tracing.
-      //   We should update the compiler to always read annotations and only remove them after
-      //   initial tracing regardless of -keepattributes.
-      builder.addKeepRuntimeVisibleAnnotations();
-      builder.addKeepRuntimeInvisibleAnnotations();
-
       // This enables native interpretation of all keep annotations.
       builder.addOptionsModification(
           o -> {
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepBindingTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepBindingTest.java
index 18bc3d5..464ee91 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepBindingTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepBindingTest.java
@@ -37,7 +37,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepClassRules(A.class, B.class)
         .addKeepMainRule(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepClassApiTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepClassApiTest.java
index 8e73b21..4abe376 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepClassApiTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepClassApiTest.java
@@ -59,7 +59,6 @@
     assertTrue(parameters.isShrinker());
     Box<Path> lib = new Box<>();
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getLibraryClasses())
         .setExcludedOuterClass(getClass())
         .applyIfShrinker(b -> lib.set(b.compile().inspect(this::checkLibraryOutput).writeToZip()));
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepFieldValueApiTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepFieldValueApiTest.java
index f9cd926..9ac84d1 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepFieldValueApiTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepFieldValueApiTest.java
@@ -58,7 +58,6 @@
     assertTrue(parameters.isShrinker());
     Box<Path> lib = new Box<>();
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getLibraryClasses())
         .setExcludedOuterClass(getClass())
         .applyIfShrinker(b -> lib.set(b.compile().inspect(this::checkLibraryOutput).writeToZip()));
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarAnyClassTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarAnyClassTest.java
index 76e7a94..bf82204 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarAnyClassTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarAnyClassTest.java
@@ -35,7 +35,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .setExcludedOuterClass(getClass())
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarSameClassTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarSameClassTest.java
index 6e287d6..0a2e16b 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarSameClassTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarSameClassTest.java
@@ -39,7 +39,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .setExcludedOuterClass(getClass())
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java
index 8d8b397..fe8eacd 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java
@@ -42,7 +42,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .setExcludedOuterClass(getClass())
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMembersApiTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMembersApiTest.java
index 3ad549d..c6d3b7d 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMembersApiTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMembersApiTest.java
@@ -58,7 +58,6 @@
     assertTrue(parameters.isShrinker());
     Box<Path> lib = new Box<>();
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getLibraryClasses())
         .setExcludedOuterClass(getClass())
         .applyIfShrinker(b -> lib.set(b.compile().inspect(this::checkLibraryOutput).writeToZip()));
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsAccessFlagsTest.java
index 9dec3d5..0de2eaf 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsAccessFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsAccessFlagsTest.java
@@ -41,7 +41,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .setExcludedOuterClass(getClass())
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
index e1db615..cac4ddb 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
@@ -40,7 +40,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(TestClass.class)
         .setExcludedOuterClass(getClass())
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepStaticBindingTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepStaticBindingTest.java
index dca36c5..1fbe385 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepStaticBindingTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepStaticBindingTest.java
@@ -36,7 +36,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsedByReflectionAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsedByReflectionAnnotationTest.java
index 9190d30..0bc2417 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsedByReflectionAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsedByReflectionAnnotationTest.java
@@ -41,7 +41,6 @@
   public void test() throws Exception {
     Class<?> mainClass = TestClass.class;
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(mainClass)
         .setExcludedOuterClass(getClass())
@@ -54,7 +53,6 @@
   public void testNoRef() throws Exception {
     Class<?> mainClass = TestClassNoRef.class;
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .addKeepMainRule(mainClass)
         .allowUnusedProguardConfigurationRules()
diff --git a/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
index 35c1494..52850da 100644
--- a/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
@@ -47,7 +47,6 @@
   @Test
   public void test() throws Exception {
     testForKeepAnno(parameters)
-        .enableNativeInterpretation()
         .addProgramClasses(getInputClasses())
         .setExcludedOuterClass(getClass())
         .run(TestClass.class)
