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..15e9fdf 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -245,9 +245,9 @@
         continue;
       }
       // Already processed packages should have been removed.
+      assert !repackagingConfiguration.isPackageInTargetLocation(pkg);
       String newPackageDescriptor =
           repackagingConfiguration.getNewPackageDescriptor(pkg, seenPackageDescriptors);
-      assert !repackagingConfiguration.isPackageInTargetLocation(pkg);
       for (DexProgramClass classToRepackage : classesToRepackage) {
         processClass(classToRepackage, pkg, newPackageDescriptor, mappings);
       }
@@ -351,7 +351,6 @@
         // Preserve full package name under destination package when not minifying
         // (no matter which package obfuscation mode is used).
         if (newPackageDescriptor.isEmpty()
-            || proguardConfiguration.getKeepPackageNamesPatterns().matches(pkg)
             || mayHavePinnedPackagePrivateOrProtectedItem(pkg)) {
           return pkg.getPackageDescriptor();
         }
@@ -360,8 +359,7 @@
         return newPackageDescriptor;
       } else if (packageObfuscationMode.isMinification()) {
         // Always keep top-level classes since their packages can never be minified.
-        if (pkg.getPackageDescriptor().equals("")
-            || proguardConfiguration.getKeepPackageNamesPatterns().matches(pkg)
+        if (pkg.getPackageDescriptor().isEmpty()
             || mayHavePinnedPackagePrivateOrProtectedItem(pkg)) {
           return pkg.getPackageDescriptor();
         }
@@ -386,9 +384,8 @@
       if (packageObfuscationMode.isRepackageClasses()) {
         return pkg.getPackageDescriptor().equals(newPackageDescriptor);
       } else if (packageObfuscationMode.isMinification()) {
-        // Always keep top-level classes since there packages can never be minified.
-        return pkg.getPackageDescriptor().equals("")
-            || proguardConfiguration.getKeepPackageNamesPatterns().matches(pkg)
+        // Always keep top-level classes since their packages can never be minified.
+        return pkg.getPackageDescriptor().isEmpty()
             || mayHavePinnedPackagePrivateOrProtectedItem(pkg);
       } else {
         assert packageObfuscationMode.isFlattenPackageHierarchy();
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingUtils.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingUtils.java
new file mode 100644
index 0000000..d8e571d
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingUtils.java
@@ -0,0 +1,30 @@
+// 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.repackaging;
+
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.shaking.ProguardClassFilter;
+import com.android.tools.r8.utils.InternalOptions;
+
+public class RepackagingUtils {
+
+  public static boolean isPackageNameKept(DexProgramClass clazz, InternalOptions options) {
+    String packageDescriptor = clazz.getType().getPackageDescriptor();
+    if (packageDescriptor.isEmpty()) {
+      return true;
+    }
+    ProguardClassFilter keepPackageNamesPatterns =
+        options.getProguardConfiguration().getKeepPackageNamesPatterns();
+    if (keepPackageNamesPatterns.isEmpty()) {
+      return false;
+    }
+    if (keepPackageNamesPatterns.matches(
+        options.dexItemFactory().createType("L" + packageDescriptor + ";"))) {
+      return true;
+    }
+    return !options.isForceProguardCompatibilityEnabled()
+        && keepPackageNamesPatterns.matches(clazz.getType());
+  }
+}
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..405060d 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -57,6 +57,7 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
 import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringSyntheticHelper;
 import com.android.tools.r8.naming.SeedMapper;
+import com.android.tools.r8.repackaging.RepackagingUtils;
 import com.android.tools.r8.shaking.KeepInfo.Joiner;
 import com.android.tools.r8.synthesis.CommittedItems;
 import com.android.tools.r8.utils.CollectionUtils;
@@ -1092,6 +1093,9 @@
     if (!keepInfo.getInfo(clazz).isRepackagingAllowed(clazz, options())) {
       return false;
     }
+    if (RepackagingUtils.isPackageNameKept(clazz, appView.options())) {
+      return false;
+    }
     SeedMapper applyMappingSeedMapper = appView.getApplyMappingSeedMapper();
     if (applyMappingSeedMapper != null && applyMappingSeedMapper.hasMapping(clazz.type)) {
       return false;
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardClassNameList.java b/src/main/java/com/android/tools/r8/shaking/ProguardClassNameList.java
index cc5d00b..5f5ad5f 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardClassNameList.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardClassNameList.java
@@ -295,7 +295,7 @@
 
     @Override
     public boolean matches(DexType type) {
-      return classNames.stream().anyMatch(name -> name.matches(type));
+      return Iterables.any(classNames, name -> name.matches(type));
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
index 36bd397..b4e83f7 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -42,8 +42,8 @@
     private boolean verbose;
     private String renameSourceFileAttribute;
     private final List<String> keepAttributePatterns = new ArrayList<>();
-    private final ProguardPackageNameList.Builder keepPackageNamesPatterns =
-        ProguardPackageNameList.builder();
+    private final ProguardClassFilter.Builder keepPackageNamesPatterns =
+        ProguardClassFilter.builder();
     private final ProguardClassFilter.Builder dontWarnPatterns = ProguardClassFilter.builder();
     private final ProguardClassFilter.Builder dontNotePatterns = ProguardClassFilter.builder();
     protected final Set<ProguardConfigurationRule> rules = Sets.newLinkedHashSet();
@@ -193,8 +193,8 @@
       this.rules.add(rule);
     }
 
-    public void addKeepPackageNamesPattern(boolean isNegated, ProguardPackageMatcher pattern) {
-      keepPackageNamesPatterns.addPackageName(isNegated, pattern);
+    public void addKeepPackageNamesPattern(ProguardClassNameList pattern) {
+      keepPackageNamesPatterns.addPattern(pattern);
     }
 
     public void addDontWarnPattern(ProguardClassNameList pattern) {
@@ -395,7 +395,7 @@
   private final boolean verbose;
   private final String renameSourceFileAttribute;
   private final ProguardKeepAttributes keepAttributes;
-  private final ProguardPackageNameList keepPackageNamesPatterns;
+  private final ProguardClassFilter keepPackageNamesPatterns;
   private final ProguardClassFilter dontWarnPatterns;
   private final ProguardClassFilter dontNotePatterns;
   protected final ImmutableList<ProguardConfigurationRule> rules;
@@ -437,7 +437,7 @@
       boolean verbose,
       String renameSourceFileAttribute,
       ProguardKeepAttributes keepAttributes,
-      ProguardPackageNameList keepPackageNamesPatterns,
+      ProguardClassFilter keepPackageNamesPatterns,
       ProguardClassFilter dontWarnPatterns,
       ProguardClassFilter dontNotePatterns,
       Set<ProguardConfigurationRule> rules,
@@ -594,7 +594,7 @@
     return keepAttributes;
   }
 
-  public ProguardPackageNameList getKeepPackageNamesPatterns() {
+  public ProguardClassFilter getKeepPackageNamesPatterns() {
     return keepPackageNamesPatterns;
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 526fc5f..803c78d 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -316,7 +316,7 @@
       } else if (acceptString("keepattributes")) {
         parseKeepAttributes();
       } else if (acceptString("keeppackagenames")) {
-        parsePackageFilter(configurationBuilder::addKeepPackageNamesPattern);
+        parseClassFilter(configurationBuilder::addKeepPackageNamesPattern);
       } else if (acceptString("keepparameternames")) {
         configurationBuilder.setKeepParameterNames(true, origin, getPosition(optionStart));
       } else if (acceptString("checkdiscard")) {
@@ -1146,6 +1146,8 @@
             builder.getModifiersBuilder().setAllowsObfuscation(true);
           } else if (acceptString("accessmodification")) {
             builder.getModifiersBuilder().setAllowsAccessModification(true);
+          } else if (acceptString("repackage")) {
+            builder.getModifiersBuilder().setAllowsRepackaging(true);
           } else if (options.isTestingOptionsEnabled()) {
             if (acceptString("annotationremoval")) {
               builder.getModifiersBuilder().setAllowsAnnotationRemoval(true);
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleModifiers.java b/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleModifiers.java
index 7535a3e..a2619f7 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleModifiers.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleModifiers.java
@@ -3,11 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
+import java.util.Objects;
+
 public class ProguardKeepRuleModifiers {
   public static class Builder {
 
     private boolean allowsAccessModification = false;
     private boolean allowsAnnotationRemoval = false;
+    private boolean allowsRepackaging = false;
     private boolean allowsShrinking = false;
     private boolean allowsOptimization = false;
     private boolean allowsObfuscation = false;
@@ -37,6 +40,14 @@
 
     public Builder setAllowsObfuscation(boolean allowsObfuscation) {
       this.allowsObfuscation = allowsObfuscation;
+      if (allowsObfuscation) {
+        this.allowsRepackaging = true;
+      }
+      return this;
+    }
+
+    public Builder setAllowsRepackaging(boolean allowsRepackaging) {
+      this.allowsRepackaging = allowsRepackaging;
       return this;
     }
 
@@ -48,6 +59,7 @@
       return new ProguardKeepRuleModifiers(
           allowsAccessModification,
           allowsAnnotationRemoval,
+          allowsRepackaging,
           allowsShrinking,
           allowsOptimization,
           allowsObfuscation,
@@ -57,6 +69,7 @@
 
   public final boolean allowsAccessModification;
   public final boolean allowsAnnotationRemoval;
+  public final boolean allowsRepackaging;
   public final boolean allowsShrinking;
   public final boolean allowsOptimization;
   public final boolean allowsObfuscation;
@@ -65,12 +78,14 @@
   private ProguardKeepRuleModifiers(
       boolean allowsAccessModification,
       boolean allowsAnnotationRemoval,
+      boolean allowsRepackaging,
       boolean allowsShrinking,
       boolean allowsOptimization,
       boolean allowsObfuscation,
       boolean includeDescriptorClasses) {
     this.allowsAccessModification = allowsAccessModification;
     this.allowsAnnotationRemoval = allowsAnnotationRemoval;
+    this.allowsRepackaging = allowsRepackaging;
     this.allowsShrinking = allowsShrinking;
     this.allowsOptimization = allowsOptimization;
     this.allowsObfuscation = allowsObfuscation;
@@ -87,6 +102,7 @@
   public boolean isBottom() {
     return allowsAccessModification
         && allowsAnnotationRemoval
+        && allowsRepackaging
         && allowsObfuscation
         && allowsOptimization
         && allowsShrinking
@@ -101,6 +117,7 @@
     ProguardKeepRuleModifiers that = (ProguardKeepRuleModifiers) o;
     return allowsAccessModification == that.allowsAccessModification
         && allowsAnnotationRemoval == that.allowsAnnotationRemoval
+        && allowsRepackaging == that.allowsRepackaging
         && allowsShrinking == that.allowsShrinking
         && allowsOptimization == that.allowsOptimization
         && allowsObfuscation == that.allowsObfuscation
@@ -109,12 +126,14 @@
 
   @Override
   public int hashCode() {
-    return (allowsAccessModification ? 1 : 0)
-        | (allowsAnnotationRemoval ? 2 : 0)
-        | (allowsShrinking ? 4 : 0)
-        | (allowsOptimization ? 8 : 0)
-        | (allowsObfuscation ? 16 : 0)
-        | (includeDescriptorClasses ? 32 : 0);
+    return Objects.hash(
+        allowsAccessModification,
+        allowsAnnotationRemoval,
+        allowsRepackaging,
+        allowsShrinking,
+        allowsOptimization,
+        allowsObfuscation,
+        includeDescriptorClasses);
   }
 
   @Override
@@ -122,6 +141,7 @@
     StringBuilder builder = new StringBuilder();
     appendWithComma(builder, allowsAccessModification, "allowaccessmodification");
     appendWithComma(builder, allowsAnnotationRemoval, "allowannotationremoval");
+    appendWithComma(builder, allowsRepackaging, "allowrepackaging");
     appendWithComma(builder, allowsObfuscation, "allowobfuscation");
     appendWithComma(builder, allowsShrinking, "allowshrinking");
     appendWithComma(builder, allowsOptimization, "allowoptimization");
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..4419a40 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -54,6 +54,7 @@
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
 import com.android.tools.r8.ir.optimize.membervaluepropagation.assume.AssumeInfo;
 import com.android.tools.r8.logging.Log;
+import com.android.tools.r8.repackaging.RepackagingUtils;
 import com.android.tools.r8.shaking.AnnotationMatchResult.AnnotationsIgnoredMatchResult;
 import com.android.tools.r8.shaking.AnnotationMatchResult.ConcreteAnnotationMatchResult;
 import com.android.tools.r8.shaking.AnnotationMatchResult.MatchedAnnotation;
@@ -1637,12 +1638,11 @@
       if (appView.options().isMinificationEnabled() && !modifiers.allowsObfuscation) {
         dependentMinimumKeepInfo
             .getOrCreateMinimumKeepInfoFor(preconditionEvent, item.getReference())
-            .disallowMinification()
-            .disallowRepackaging();
+            .disallowMinification();
         context.markAsUsed();
       }
 
-      if (appView.options().isRepackagingEnabled() && !modifiers.allowsObfuscation) {
+      if (appView.options().isRepackagingEnabled() && isRepackagingDisallowed(item, modifiers)) {
         dependentMinimumKeepInfo
             .getOrCreateMinimumKeepInfoFor(preconditionEvent, item.getReference())
             .disallowRepackaging();
@@ -1676,6 +1676,14 @@
       }
     }
 
+    private boolean isRepackagingDisallowed(
+        ProgramDefinition item, ProguardKeepRuleModifiers modifiers) {
+      if (!modifiers.allowsRepackaging) {
+        return true;
+      }
+      return RepackagingUtils.isPackageNameKept(item.getContextClass(), options);
+    }
+
     private void evaluateIdentifierNameStringRule(
         Definition item, ProguardConfigurationRule context, ProguardIfRule ifRule) {
       // Main dex rules should not contain -identifiernamestring rules.
diff --git a/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java b/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
index bb73c3f..5eb7783 100644
--- a/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
+++ b/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
@@ -99,4 +99,14 @@
         .compile()
         .inspect(config::inspect);
   }
+
+  @Test
+  public void testR8Compat() throws Exception {
+    testForR8Compat(Backend.DEX)
+        .addProgramClasses(CLASSES)
+        .addKeepAllClassesRuleWithAllowObfuscation()
+        .addKeepRules(config.getKeepRule())
+        .compile()
+        .inspect(config::inspect);
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java b/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java
index 309ab55..e7c14ff 100644
--- a/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java
+++ b/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.ProguardVersion;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestCompileResult;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestShrinkerBuilder;
@@ -34,22 +33,22 @@
 
   @Test
   public void testR8Compat() throws Exception {
-    run(testForR8Compat(Backend.CF));
+    run(testForR8Compat(Backend.CF), false);
   }
 
   @Test
   public void testR8Full() throws Exception {
-    run(testForR8(Backend.CF));
+    run(testForR8(Backend.CF), true);
   }
 
   @Test
   public void testR8PG() throws Exception {
-    run(testForProguard(ProguardVersion.V7_0_0).addKeepRules("-dontwarn"));
+    run(testForProguard(ProguardVersion.V7_0_0).addKeepRules("-dontwarn"), false);
   }
 
-  private TestCompileResult<?, ?> run(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder)
+  private void run(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder, boolean isFullMode)
       throws Exception {
-    return testBuilder
+    testBuilder
         .addProgramClassFileData(
             transformer(Main.class)
                 .setClassDescriptor("Lfoo/Main;")
@@ -64,7 +63,11 @@
               assertEquals(1, inspector.allClasses().size());
               inspector.forAllClasses(
                   clazz -> {
-                    assertNotEquals("foo", clazz.getDexProgramClass().getType().getPackageName());
+                    if (isFullMode) {
+                      assertEquals("foo", clazz.getDexProgramClass().getType().getPackageName());
+                    } else {
+                      assertNotEquals("foo", clazz.getDexProgramClass().getType().getPackageName());
+                    }
                   });
             });
   }
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java
new file mode 100644
index 0000000..686be1d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java
@@ -0,0 +1,64 @@
+// 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.repackage;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.TestParameters;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RepackageAllowRepackagingTest extends RepackageTestBase {
+
+  public RepackageAllowRepackagingTest(
+      String flattenPackageHierarchyOrRepackageClasses, TestParameters parameters) {
+    super(flattenPackageHierarchyOrRepackageClasses, parameters);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(Main.class)
+        .apply(this::configureRepackaging)
+        .addKeepRules(
+            "-keep,allowrepackage class " + typeName(ShouldStayInPackage.class) + " { *; }")
+        .addKeepRules(
+            "-keep,allowrepackage class " + typeName(ShouldBeRepackaged.class) + " { *; }")
+        .compile()
+        .inspect(
+            inspector -> {
+              assertThat(ShouldStayInPackage.class, isNotRepackaged(inspector));
+              assertThat(ShouldBeRepackaged.class, isRepackaged(inspector));
+            })
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("ShouldStayInPackage::foo", "ShouldBeRepackaged::bar");
+  }
+
+  public static class ShouldStayInPackage {
+
+    static void foo() {
+      System.out.println("ShouldStayInPackage::foo");
+    }
+  }
+
+  public static class ShouldBeRepackaged {
+
+    public static void bar() {
+      System.out.println("ShouldBeRepackaged::bar");
+    }
+  }
+
+  public static class Main {
+
+    public static void main(String[] args) {
+      ShouldStayInPackage.foo();
+      ShouldBeRepackaged.bar();
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageKeepPackageNameTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageKeepPackageNameTest.java
new file mode 100644
index 0000000..bcffb5f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageKeepPackageNameTest.java
@@ -0,0 +1,73 @@
+// 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.repackage;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestParameters;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RepackageKeepPackageNameTest extends RepackageTestBase {
+
+  public RepackageKeepPackageNameTest(
+      String flattenPackageHierarchyOrRepackageClasses, TestParameters parameters) {
+    super(flattenPackageHierarchyOrRepackageClasses, parameters);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    R8TestCompileResult compileLib =
+        testForR8(parameters.getBackend())
+            .addInnerClasses(getClass())
+            .setMinApi(parameters.getApiLevel())
+            .addKeepClassAndMembersRulesWithAllowObfuscation(
+                ShouldStayInPackage.class, ShouldBeRepackaged.class)
+            .addKeepPackageNamesRule(typeName(ShouldStayInPackage.class))
+            .apply(this::configureRepackaging)
+            .compile()
+            .inspect(
+                inspector -> {
+                  assertThat(ShouldStayInPackage.class, isNotRepackaged(inspector));
+                  assertThat(ShouldBeRepackaged.class, isRepackaged(inspector));
+                });
+
+    testForR8(parameters.getBackend())
+        .addProgramClasses(Runner.class)
+        .addClasspathClasses(ShouldStayInPackage.class, ShouldBeRepackaged.class)
+        .addApplyMapping(compileLib.getProguardMap())
+        .addKeepMainRule(Runner.class)
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .addRunClasspathFiles(compileLib.writeToZip())
+        .run(parameters.getRuntime(), Runner.class)
+        .assertSuccessWithOutputLines("ShouldStayInPackage::foo", "ShouldBeRepackaged::bar");
+  }
+
+  public static class ShouldStayInPackage {
+
+    static void foo() {
+      System.out.println("ShouldStayInPackage::foo");
+    }
+  }
+
+  public static class ShouldBeRepackaged {
+
+    public static void bar() {
+      System.out.println("ShouldBeRepackaged::bar");
+    }
+  }
+
+  public static class Runner {
+
+    public static void main(String[] args) {
+      ShouldStayInPackage.foo();
+      ShouldBeRepackaged.bar();
+    }
+  }
+}
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..6f79b12 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java
@@ -76,8 +76,8 @@
   }
 
   private void inspect(CodeInspector inspector) {
-    assertThat(A.class, isRepackagedIf(inspector, allowAccessModification));
-    assertThat(B.class, isRepackagedIf(inspector, allowAccessModification));
+    assertThat(A.class, isNotRepackaged(inspector));
+    assertThat(B.class, isNotRepackaged(inspector));
   }
 
   public static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index 2b8d68b..8149c5b 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -1513,48 +1513,30 @@
     testKeepattributes(expected, config);
   }
 
-  private void testKeeppackagenames(ProguardPackageNameList expected, String config) {
+  private void testKeeppackagenames(String config) {
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(new DexItemFactory(), reporter);
     parser.parse(createConfigurationForTesting(ImmutableList.of(config)));
     verifyParserEndsCleanly();
-    assertEquals(expected, parser.getConfigRawForTesting().getKeepPackageNamesPatterns());
   }
 
   @Test
   public void parseKeeppackagenames() {
-    ProguardPackageNameList xxxYYY =
-        ProguardPackageNameList.builder()
-            .addPackageName(false, new ProguardPackageMatcher("xxx"))
-            .addPackageName(false, new ProguardPackageMatcher("yyy"))
-            .build();
-    testKeeppackagenames(xxxYYY, "-keeppackagenames xxx,yyy");
-    testKeeppackagenames(xxxYYY, "-keeppackagenames xxx, yyy");
-    testKeeppackagenames(xxxYYY, "-keeppackagenames xxx ,yyy");
-    testKeeppackagenames(xxxYYY, "-keeppackagenames xxx   ,   yyy");
-    testKeeppackagenames(xxxYYY, "-keeppackagenames       xxx   ,   yyy     ");
-    testKeeppackagenames(xxxYYY, "-keeppackagenames       xxx   ,   yyy     \n");
-    testKeeppackagenames(xxxYYY, "-keeppackagenames \"xxx\",\"yyy\"");
+    testKeeppackagenames("-keeppackagenames xxx,yyy");
+    testKeeppackagenames("-keeppackagenames xxx, yyy");
+    testKeeppackagenames("-keeppackagenames xxx ,yyy");
+    testKeeppackagenames("-keeppackagenames xxx   ,   yyy");
+    testKeeppackagenames("-keeppackagenames       xxx   ,   yyy     ");
+    testKeeppackagenames("-keeppackagenames       xxx   ,   yyy     \n");
+    testKeeppackagenames("-keeppackagenames \"xxx\",\"yyy\"");
 
     testKeeppackagenames(
-        ProguardPackageNameList.builder()
-            .addPackageName(false, new ProguardPackageMatcher("com.**"))
-            .addPackageName(false, new ProguardPackageMatcher("org.*"))
-            .build(),
         "-keeppackagenames com.**, org.*");
 
     testKeeppackagenames(
-        ProguardPackageNameList.builder()
-            .addPackageName(false, new ProguardPackageMatcher("c?m.**"))
-            .addPackageName(false, new ProguardPackageMatcher("?r?.*"))
-            .build(),
         "-keeppackagenames c?m.**, ?r?.*");
 
     testKeeppackagenames(
-        ProguardPackageNameList.builder()
-            .addPackageName(true, new ProguardPackageMatcher("c?m.**"))
-            .addPackageName(true, new ProguardPackageMatcher("?r?.*"))
-            .build(),
         "-keeppackagenames !c?m.**, !?r?.*");
   }
 
