diff --git a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
index f292409..d3aee17 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -440,7 +440,7 @@
                   + simpleName.substring(outerClassSimpleName.length());
           repackagedDexType = repackagedDexType.withSimpleName(newSimpleName, dexItemFactory);
         } else {
-          assert false
+          assert options.disableInnerClassSeparatorValidationWhenRepackaging
               : "Unexpected name for inner class: "
                   + clazz.getType().toSourceString()
                   + " (outer class: "
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index a8058ac..9e0db7a 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -64,7 +64,6 @@
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.PredicateSet;
 import com.android.tools.r8.utils.ThreadUtils;
-import com.android.tools.r8.utils.TraversalContinuation;
 import com.android.tools.r8.utils.Visibility;
 import com.android.tools.r8.utils.WorkList;
 import com.android.tools.r8.utils.collections.ProgramMethodSet;
@@ -1089,22 +1088,11 @@
     if (!options().isRepackagingEnabled()) {
       return false;
     }
-    if (!keepInfo.getInfo(clazz).isRepackagingAllowed(clazz, options())) {
+    if (!keepInfo.getInfo(clazz).isRepackagingAllowed(options())) {
       return false;
     }
     SeedMapper applyMappingSeedMapper = appView.getApplyMappingSeedMapper();
-    if (applyMappingSeedMapper != null && applyMappingSeedMapper.hasMapping(clazz.type)) {
-      return false;
-    }
-    return clazz
-        .traverseProgramMembers(
-            member -> {
-              if (keepInfo.getInfo(member).isRepackagingAllowed(member, options())) {
-                return TraversalContinuation.doContinue();
-              }
-              return TraversalContinuation.doBreak();
-            })
-        .shouldContinue();
+    return applyMappingSeedMapper == null || !applyMappingSeedMapper.hasMapping(clazz.type);
   }
 
   public boolean isPinned(DexReference reference) {
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java
index 9785028..f504792 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.utils.InternalOptions;
 import java.util.function.Function;
 
@@ -15,10 +14,10 @@
 public final class KeepClassInfo extends KeepInfo<KeepClassInfo.Builder, KeepClassInfo> {
 
   // Requires all aspects of a class to be kept.
-  private static final KeepClassInfo TOP = new Builder().makeTop().build();
+  private static final KeepClassInfo TOP = new Builder().makeTop().disallowRepackaging().build();
 
   // Requires no aspects of a class to be kept.
-  private static final KeepClassInfo BOTTOM = new Builder().makeBottom().build();
+  private static final KeepClassInfo BOTTOM = new Builder().makeBottom().allowRepackaging().build();
 
   public static KeepClassInfo top() {
     return TOP;
@@ -32,10 +31,12 @@
     return bottom().joiner();
   }
 
+  private final boolean allowRepackaging;
   private final boolean checkEnumUnboxed;
 
   private KeepClassInfo(Builder builder) {
     super(builder);
+    this.allowRepackaging = builder.isRepackagingAllowed();
     this.checkEnumUnboxed = builder.isCheckEnumUnboxedEnabled();
   }
 
@@ -57,13 +58,18 @@
     return new Joiner(this);
   }
 
-  @Override
-  public boolean isRepackagingAllowed(
-      ProgramDefinition definition, GlobalKeepInfoConfiguration configuration) {
-    return configuration.isRepackagingEnabled()
-        && internalIsRepackagingAllowed()
-        && (definition.getAccessFlags().isPublic()
-            || !internalIsAccessModificationRequiredForRepackaging());
+  /**
+   * True if an item may be repackaged.
+   *
+   * <p>This method requires knowledge of the global configuration as that can override the concrete
+   * value on a given item.
+   */
+  public boolean isRepackagingAllowed(GlobalKeepInfoConfiguration configuration) {
+    return configuration.isRepackagingEnabled() && internalIsRepackagingAllowed();
+  }
+
+  boolean internalIsRepackagingAllowed() {
+    return allowRepackaging;
   }
 
   public boolean isKotlinMetadataRemovalAllowed(
@@ -98,6 +104,7 @@
 
   public static class Builder extends KeepInfo.Builder<Builder, KeepClassInfo> {
 
+    private boolean allowRepackaging;
     private boolean checkEnumUnboxed;
 
     private Builder() {
@@ -106,6 +113,7 @@
 
     private Builder(KeepClassInfo original) {
       super(original);
+      allowRepackaging = original.internalIsRepackagingAllowed();
       checkEnumUnboxed = original.internalIsCheckEnumUnboxedEnabled();
     }
 
@@ -120,6 +128,23 @@
       return self();
     }
 
+    public boolean isRepackagingAllowed() {
+      return allowRepackaging;
+    }
+
+    private Builder setAllowRepackaging(boolean allowRepackaging) {
+      this.allowRepackaging = allowRepackaging;
+      return self();
+    }
+
+    public Builder allowRepackaging() {
+      return setAllowRepackaging(true);
+    }
+
+    public Builder disallowRepackaging() {
+      return setAllowRepackaging(false);
+    }
+
     public Builder setCheckEnumUnboxed() {
       return setCheckEnumUnboxed(true);
     }
@@ -151,6 +176,7 @@
     @Override
     boolean internalIsEqualTo(KeepClassInfo other) {
       return super.internalIsEqualTo(other)
+          && isRepackagingAllowed() == other.internalIsRepackagingAllowed()
           && isCheckEnumUnboxedEnabled() == other.internalIsCheckEnumUnboxedEnabled();
     }
 
@@ -161,12 +187,12 @@
 
     @Override
     public Builder makeTop() {
-      return super.makeTop().unsetCheckEnumUnboxed();
+      return super.makeTop().unsetCheckEnumUnboxed().disallowRepackaging();
     }
 
     @Override
     public Builder makeBottom() {
-      return super.makeBottom().unsetCheckEnumUnboxed();
+      return super.makeBottom().unsetCheckEnumUnboxed().allowRepackaging();
     }
   }
 
@@ -181,6 +207,11 @@
       return self();
     }
 
+    public Joiner disallowRepackaging() {
+      builder.disallowRepackaging();
+      return self();
+    }
+
     @Override
     public Joiner asClassJoiner() {
       return this;
@@ -190,7 +221,8 @@
     public Joiner merge(Joiner joiner) {
       // Should be extended to merge the fields of this class in case any are added.
       return super.merge(joiner)
-          .applyIf(joiner.builder.isCheckEnumUnboxedEnabled(), Joiner::setCheckEnumUnboxed);
+          .applyIf(joiner.builder.isCheckEnumUnboxedEnabled(), Joiner::setCheckEnumUnboxed)
+          .applyIf(!joiner.builder.isRepackagingAllowed(), Joiner::disallowRepackaging);
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
index d9708ce..092f4ea 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.EnclosingMethodAttribute;
-import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.shaking.KeepInfo.Builder;
 import com.android.tools.r8.shaking.KeepReason.ReflectiveUseFrom;
 import com.android.tools.r8.utils.InternalOptions;
@@ -22,31 +21,25 @@
   private final boolean allowAnnotationRemoval;
   private final boolean allowMinification;
   private final boolean allowOptimization;
-  private final boolean allowRepackaging;
   private final boolean allowShrinking;
   private final boolean allowSignatureRemoval;
   private final boolean checkDiscarded;
-  private final boolean requireAccessModificationForRepackaging;
 
   private KeepInfo(
       boolean allowAccessModification,
       boolean allowAnnotationRemoval,
       boolean allowMinification,
       boolean allowOptimization,
-      boolean allowRepackaging,
       boolean allowShrinking,
       boolean allowSignatureRemoval,
-      boolean checkDiscarded,
-      boolean requireAccessModificationForRepackaging) {
+      boolean checkDiscarded) {
     this.allowAccessModification = allowAccessModification;
     this.allowAnnotationRemoval = allowAnnotationRemoval;
     this.allowMinification = allowMinification;
     this.allowOptimization = allowOptimization;
-    this.allowRepackaging = allowRepackaging;
     this.allowShrinking = allowShrinking;
     this.allowSignatureRemoval = allowSignatureRemoval;
     this.checkDiscarded = checkDiscarded;
-    this.requireAccessModificationForRepackaging = requireAccessModificationForRepackaging;
   }
 
   KeepInfo(B builder) {
@@ -55,11 +48,9 @@
         builder.isAnnotationRemovalAllowed(),
         builder.isMinificationAllowed(),
         builder.isOptimizationAllowed(),
-        builder.isRepackagingAllowed(),
         builder.isShrinkingAllowed(),
         builder.isSignatureRemovalAllowed(),
-        builder.isCheckDiscardedEnabled(),
-        builder.isAccessModificationRequiredForRepackaging());
+        builder.isCheckDiscardedEnabled());
   }
 
   public static Joiner<?, ?, ?> newEmptyJoinerFor(DexReference reference) {
@@ -164,23 +155,6 @@
   }
 
   /**
-   * True if an item may be repackaged.
-   *
-   * <p>This method requires knowledge of the global configuration as that can override the concrete
-   * value on a given item.
-   */
-  public abstract boolean isRepackagingAllowed(
-      ProgramDefinition definition, GlobalKeepInfoConfiguration configuration);
-
-  boolean internalIsRepackagingAllowed() {
-    return allowRepackaging;
-  }
-
-  boolean internalIsAccessModificationRequiredForRepackaging() {
-    return requireAccessModificationForRepackaging;
-  }
-
-  /**
    * True if an item may have its access flags modified.
    *
    * <p>This method requires knowledge of the global access modification as that will override the
@@ -242,7 +216,6 @@
         && (allowAnnotationRemoval || !other.internalIsAnnotationRemovalAllowed())
         && (allowMinification || !other.internalIsMinificationAllowed())
         && (allowOptimization || !other.internalIsOptimizationAllowed())
-        && (allowRepackaging || !other.internalIsRepackagingAllowed())
         && (allowShrinking || !other.internalIsShrinkingAllowed())
         && (allowSignatureRemoval || !other.internalIsSignatureRemovalAllowed())
         && (!checkDiscarded || other.internalIsCheckDiscardedEnabled());
@@ -265,12 +238,10 @@
     private boolean allowAccessModification;
     private boolean allowAnnotationRemoval;
     private boolean allowMinification;
-    private boolean allowRepackaging;
     private boolean allowOptimization;
     private boolean allowShrinking;
     private boolean allowSignatureRemoval;
     private boolean checkDiscarded;
-    private boolean requireAccessModificationForRepackaging;
 
     Builder() {
       // Default initialized. Use should be followed by makeTop/makeBottom.
@@ -282,12 +253,9 @@
       allowAnnotationRemoval = original.internalIsAnnotationRemovalAllowed();
       allowMinification = original.internalIsMinificationAllowed();
       allowOptimization = original.internalIsOptimizationAllowed();
-      allowRepackaging = original.internalIsRepackagingAllowed();
       allowShrinking = original.internalIsShrinkingAllowed();
       allowSignatureRemoval = original.internalIsSignatureRemovalAllowed();
       checkDiscarded = original.internalIsCheckDiscardedEnabled();
-      requireAccessModificationForRepackaging =
-          original.internalIsAccessModificationRequiredForRepackaging();
     }
 
     B makeTop() {
@@ -295,11 +263,9 @@
       disallowAnnotationRemoval();
       disallowMinification();
       disallowOptimization();
-      disallowRepackaging();
       disallowShrinking();
       disallowSignatureRemoval();
       unsetCheckDiscarded();
-      requireAccessModificationForRepackaging();
       return self();
     }
 
@@ -308,11 +274,9 @@
       allowAnnotationRemoval();
       allowMinification();
       allowOptimization();
-      allowRepackaging();
       allowShrinking();
       allowSignatureRemoval();
       unsetCheckDiscarded();
-      unsetRequireAccessModificationForRepackaging();
       return self();
     }
 
@@ -336,16 +300,9 @@
           && isAnnotationRemovalAllowed() == other.internalIsAnnotationRemovalAllowed()
           && isMinificationAllowed() == other.internalIsMinificationAllowed()
           && isOptimizationAllowed() == other.internalIsOptimizationAllowed()
-          && isRepackagingAllowed() == other.internalIsRepackagingAllowed()
           && isShrinkingAllowed() == other.internalIsShrinkingAllowed()
           && isSignatureRemovalAllowed() == other.internalIsSignatureRemovalAllowed()
-          && isCheckDiscardedEnabled() == other.internalIsCheckDiscardedEnabled()
-          && isAccessModificationRequiredForRepackaging()
-              == other.internalIsAccessModificationRequiredForRepackaging();
-    }
-
-    public boolean isAccessModificationRequiredForRepackaging() {
-      return requireAccessModificationForRepackaging;
+          && isCheckDiscardedEnabled() == other.internalIsCheckDiscardedEnabled();
     }
 
     public boolean isAccessModificationAllowed() {
@@ -368,10 +325,6 @@
       return allowOptimization;
     }
 
-    public boolean isRepackagingAllowed() {
-      return allowRepackaging;
-    }
-
     public boolean isShrinkingAllowed() {
       return allowShrinking;
     }
@@ -393,19 +346,6 @@
       return setAllowMinification(false);
     }
 
-    public B setAllowRepackaging(boolean allowRepackaging) {
-      this.allowRepackaging = allowRepackaging;
-      return self();
-    }
-
-    public B allowRepackaging() {
-      return setAllowRepackaging(true);
-    }
-
-    public B disallowRepackaging() {
-      return setAllowRepackaging(false);
-    }
-
     public B setAllowOptimization(boolean allowOptimization) {
       this.allowOptimization = allowOptimization;
       return self();
@@ -445,20 +385,6 @@
       return setCheckDiscarded(false);
     }
 
-    public B setRequireAccessModificationForRepackaging(
-        boolean requireAccessModificationForRepackaging) {
-      this.requireAccessModificationForRepackaging = requireAccessModificationForRepackaging;
-      return self();
-    }
-
-    public B requireAccessModificationForRepackaging() {
-      return setRequireAccessModificationForRepackaging(true);
-    }
-
-    public B unsetRequireAccessModificationForRepackaging() {
-      return setRequireAccessModificationForRepackaging(false);
-    }
-
     public B setAllowAccessModification(boolean allowAccessModification) {
       this.allowAccessModification = allowAccessModification;
       return self();
@@ -608,11 +534,6 @@
       return self();
     }
 
-    public J disallowRepackaging() {
-      builder.disallowRepackaging();
-      return self();
-    }
-
     public J disallowOptimization() {
       builder.disallowOptimization();
       return self();
@@ -633,24 +554,15 @@
       return self();
     }
 
-    public J requireAccessModificationForRepackaging() {
-      builder.requireAccessModificationForRepackaging();
-      return self();
-    }
-
     public J merge(J joiner) {
       Builder<B, K> builder = joiner.builder;
       applyIf(!builder.isAccessModificationAllowed(), Joiner::disallowAccessModification);
       applyIf(!builder.isAnnotationRemovalAllowed(), Joiner::disallowAnnotationRemoval);
       applyIf(!builder.isMinificationAllowed(), Joiner::disallowMinification);
       applyIf(!builder.isOptimizationAllowed(), Joiner::disallowOptimization);
-      applyIf(!builder.isRepackagingAllowed(), Joiner::disallowRepackaging);
       applyIf(!builder.isShrinkingAllowed(), Joiner::disallowShrinking);
       applyIf(!builder.isSignatureRemovalAllowed(), Joiner::disallowSignatureRemoval);
       applyIf(builder.isCheckDiscardedEnabled(), Joiner::setCheckDiscarded);
-      applyIf(
-          builder.isAccessModificationRequiredForRepackaging(),
-          Joiner::requireAccessModificationForRepackaging);
       reasons.addAll(joiner.reasons);
       rules.addAll(joiner.rules);
       return self();
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
index 62529ed..c78e39a 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
@@ -140,6 +140,10 @@
     throw new Unreachable();
   }
 
+  public final KeepClassInfo getInfo(DexProgramClass clazz) {
+    return getClassInfo(clazz);
+  }
+
   public final KeepInfo<?, ?> getInfo(ProgramDefinition definition) {
     if (definition.isProgramClass()) {
       return getClassInfo(definition.asProgramClass());
@@ -279,8 +283,7 @@
             assert newType == type
                 || !info.isPinned(options)
                 || info.isMinificationAllowed(options)
-                || info.isRepackagingAllowed(
-                    definitions.definitionFor(newType).asProgramClass(), options);
+                || info.isRepackagingAllowed(options);
             KeepClassInfo previous = newClassInfo.put(newType, info);
             assert previous == null;
           });
@@ -461,29 +464,6 @@
       joinMethod(method, KeepInfo.Joiner::top);
     }
 
-    public void unsetRequireAllowAccessModificationForRepackaging(ProgramDefinition definition) {
-      if (definition.isProgramClass()) {
-        DexProgramClass clazz = definition.asProgramClass();
-        KeepClassInfo info = getClassInfo(clazz);
-        keepClassInfo.put(
-            clazz.getType(), info.builder().unsetRequireAccessModificationForRepackaging().build());
-      } else if (definition.isProgramMethod()) {
-        ProgramMethod method = definition.asProgramMethod();
-        KeepMethodInfo info = getMethodInfo(method);
-        keepMethodInfo.put(
-            method.getReference(),
-            info.builder().unsetRequireAccessModificationForRepackaging().build());
-      } else if (definition.isProgramField()) {
-        ProgramField field = definition.asProgramField();
-        KeepFieldInfo info = getFieldInfo(field);
-        keepFieldInfo.put(
-            field.getReference(),
-            info.builder().unsetRequireAccessModificationForRepackaging().build());
-      } else {
-        throw new Unreachable();
-      }
-    }
-
     public void joinField(ProgramField field, Consumer<? super KeepFieldInfo.Joiner> fn) {
       KeepFieldInfo info = getFieldInfo(field);
       if (info.isTop()) {
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepMemberInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepMemberInfo.java
index 2225e14..e77c27e 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepMemberInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepMemberInfo.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8.shaking;
 
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.shaking.KeepInfo.Builder;
 
 /** Immutable keep requirements for a member. */
@@ -15,14 +14,6 @@
     super(builder);
   }
 
-  @Override
-  public boolean isRepackagingAllowed(
-      ProgramDefinition definition, GlobalKeepInfoConfiguration configuration) {
-    return configuration.isRepackagingEnabled()
-        && (definition.getAccessFlags().isPublic()
-            || !internalIsAccessModificationRequiredForRepackaging());
-  }
-
   public boolean isKotlinMetadataRemovalAllowed(
       DexProgramClass holder, GlobalKeepInfoConfiguration configuration) {
     // Checking the holder for missing kotlin information relies on the holder being processed
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index 3b46564..cc39429 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -1135,6 +1135,7 @@
         dependentMinimumKeepInfo
             .getOrCreateMinimumKeepInfoFor(preconditionEvent, clazz.getReference())
             .disallowMinification()
+            .asClassJoiner()
             .disallowRepackaging();
       }
     }
@@ -1638,14 +1639,14 @@
         dependentMinimumKeepInfo
             .getOrCreateMinimumKeepInfoFor(preconditionEvent, item.getReference())
             .disallowMinification()
-            .disallowRepackaging();
+            .applyIf(item.isProgramClass(), joiner -> joiner.asClassJoiner().disallowRepackaging());
         context.markAsUsed();
       }
 
       if (appView.options().isRepackagingEnabled() && !modifiers.allowsObfuscation) {
         dependentMinimumKeepInfo
             .getOrCreateMinimumKeepInfoFor(preconditionEvent, item.getReference())
-            .disallowRepackaging();
+            .applyIf(item.isProgramClass(), joiner -> joiner.asClassJoiner().disallowRepackaging());
         context.markAsUsed();
       }
 
@@ -1664,10 +1665,6 @@
                 .addRule(keepRule)
                 .disallowShrinking();
         context.markAsUsed();
-
-        if (item.getAccessFlags().isPackagePrivateOrProtected()) {
-          minimumKeepInfoForItem.requireAccessModificationForRepackaging();
-        }
       }
 
       if (modifiers.includeDescriptorClasses) {
@@ -1981,7 +1978,8 @@
       getDependentMinimumKeepInfo()
           .getOrCreateUnconditionalMinimumKeepInfoFor(definition.getReference())
           .disallowMinification()
-          .disallowRepackaging();
+          .applyIf(
+              definition.isProgramClass(), joiner -> joiner.asClassJoiner().disallowRepackaging());
     }
 
     public boolean verifyKeptFieldsAreAccessedAndLive(AppView<AppInfoWithLiveness> appView) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 68c055f..9af4f06 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -804,6 +804,7 @@
   public boolean reportMissingClassesInEnclosingMethodAttribute = false;
   public boolean reportMissingClassesInInnerClassAttributes = false;
   public boolean disableGenericSignatureValidation = false;
+  public boolean disableInnerClassSeparatorValidationWhenRepackaging = false;
 
   // EXPERIMENTAL flag to get behaviour as close to Proguard as possible.
   public boolean forceProguardCompatibility = false;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
index 8b33acb..374fb98 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
@@ -225,12 +225,16 @@
     R8TestCompileResult r8CompileResult =
         testForR8(parameters.getBackend())
             .addKeepMainRule(MAIN_CLASS)
-            .addKeepRules("-keep,allowobfuscation class * { *; }")
-            .addKeepRules("-keepattributes InnerClasses,EnclosingMethod")
+            .addKeepAllClassesRuleWithAllowObfuscation()
+            .addKeepAttributeInnerClassesAndEnclosingMethod()
             .addProgramClassFileData(InnerClassNameTestDump.dump(config, parameters))
             .allowDiagnosticInfoMessages(hasMalformedInnerClassAttribute())
             .minification(minify)
-            .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
+            .addOptionsModification(
+                options -> {
+                  options.disableInnerClassSeparatorValidationWhenRepackaging = true;
+                  options.disableNameReflectionOptimization();
+                })
             .setMinApi(parameters.getApiLevel())
             .compile()
             .apply(this::checkWarningsAboutMalformedAttribute);
diff --git a/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java b/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java
index 487498f..fa9de18 100644
--- a/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java
@@ -356,13 +356,11 @@
         ba.getDexProgramClass().getType().getPackageName(),
         bb.getDexProgramClass().getType().getPackageName());
 
-    // We cannot repackage c or d since these have package-private members and a
-    // keep,allowobfuscation. For us to be able to repackage them, we have to use
-    // -allowaccesmodification.
+    // We can repackage c and d since these have no external package-private references.
     List<String> klasses = ImmutableList.of("naming101.c", "naming101.d");
     for (String klass : klasses) {
       ClassSubject k = inspector.clazz(klass);
-      assertNotEquals("naming101.a", k.getDexProgramClass().getType().getPackageName());
+      assertEquals("naming101.a", k.getDexProgramClass().getType().getPackageName());
     }
 
     // All other classes can be repackaged to naming101.a, but naming101.a.a exists to make a name
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java
index a6c9ea3..8152688 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java
@@ -45,7 +45,7 @@
         .addKeepMainRule(Main.class)
         .addDontWarn(RepackageProtectedInSamePackageTest.class, NeverClassInline.class)
         .run(parameters.getRuntime(), Main.class, typeName(RepackageForKeepClassMembers.class))
-        .inspect(inspector -> inspect(inspector, true))
+        .inspect(this::inspect)
         .assertSuccessWithOutputLines(EXPECTED);
   }
 
@@ -61,7 +61,7 @@
         .addKeepMainRule(Main.class)
         .enableNeverClassInliningAnnotations()
         .run(parameters.getRuntime(), Main.class)
-        .inspect(inspector -> inspect(inspector, false))
+        .inspect(this::inspect)
         .assertSuccessWithOutputLines(EXPECTED);
   }
 
@@ -82,16 +82,10 @@
         .transform();
   }
 
-  private void inspect(CodeInspector inspector, boolean isProguard) {
+  private void inspect(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(RepackageForKeepClassMembers.class);
     assertThat(clazz, isPresent());
-    // TODO(b/250671873): We should be able to repackage the Sub class since the only reference
-    //  to Sub.class is in the same package and we have allowobfuscation.
-    if (isProguard) {
-      assertThat(RepackageForKeepClassMembers.class, isRepackaged(inspector));
-    } else {
-      assertThat(RepackageForKeepClassMembers.class, isNotRepackaged(inspector));
-    }
+    assertThat(RepackageForKeepClassMembers.class, isRepackaged(inspector));
     assertThat(clazz.uniqueFieldWithOriginalName("hashCodeCache"), isPresentAndNotRenamed());
     assertThat(clazz.uniqueMethodWithOriginalName("calculateHashCode"), isPresentAndNotRenamed());
   }
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageTest.java
index 179845d..9742b6a 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageTest.java
@@ -163,18 +163,16 @@
 
     // 3.A, 3.B, 3.C) Accessing a kept method is OK.
     markShouldAlwaysBeEligible.accept(AccessPublicKeptMethodOnReachableClass.class);
-    markEligibleWithAllowAccessModification.accept(
-        AccessPackagePrivateKeptMethodOnReachableClassDirect.class);
-    markEligibleWithAllowAccessModification.accept(
-        AccessPackagePrivateKeptMethodOnReachableClassIndirect.class);
+    markShouldAlwaysBeEligible.accept(AccessPackagePrivateKeptMethodOnReachableClassDirect.class);
+    markShouldAlwaysBeEligible.accept(AccessPackagePrivateKeptMethodOnReachableClassIndirect.class);
 
     // 4) -keepclassmembers,allowobfuscation class ReachableClassWithKeptMethod { <methods>; }
 
     // 4.A, 4.B, 4.C) Accessing a kept method is OK.
     markShouldAlwaysBeEligible.accept(AccessPublicKeptMethodAllowRenamingOnReachableClass.class);
-    markEligibleWithAllowAccessModification.accept(
+    markShouldAlwaysBeEligible.accept(
         AccessPackagePrivateKeptMethodAllowRenamingOnReachableClassDirect.class);
-    markEligibleWithAllowAccessModification.accept(
+    markShouldAlwaysBeEligible.accept(
         AccessPackagePrivateKeptMethodAllowRenamingOnReachableClassIndirect.class);
 
     // 5) No keep rule.
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java
index 8020e78..fda2011 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java
@@ -10,6 +10,7 @@
 
 import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -62,7 +63,12 @@
         .compile()
         .addRunClasspathFiles(compileResult.writeToZip())
         .run(parameters.getRuntime(), TestClass.class)
-        .assertSuccessWithOutputLines("Hello world!");
+        .assertFailureWithErrorThatThrowsIf(hasIllegalAccessError(), IllegalAccessError.class)
+        .assertSuccessWithOutputLinesIf(!hasIllegalAccessError(), "Hello world!");
+  }
+
+  private boolean hasIllegalAccessError() {
+    return !allowAccessModification && !parameters.isDexRuntimeVersion(Version.V8_1_0);
   }
 
   private List<String> getKeepRules() {
@@ -76,8 +82,8 @@
   }
 
   private void inspect(CodeInspector inspector) {
-    assertThat(A.class, isRepackagedIf(inspector, allowAccessModification));
-    assertThat(B.class, isRepackagedIf(inspector, allowAccessModification));
+    assertThat(A.class, isRepackaged(inspector));
+    assertThat(B.class, isRepackaged(inspector));
   }
 
   public static class TestClass {
