diff --git a/src/test/examplesJava11/nesthostexample/BasicNestHostClassMerging.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostClassMerging.java
similarity index 94%
rename from src/test/examplesJava11/nesthostexample/BasicNestHostClassMerging.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostClassMerging.java
index 184c201..f2de820 100644
--- a/src/test/examplesJava11/nesthostexample/BasicNestHostClassMerging.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostClassMerging.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import com.android.tools.r8.NeverInline;
 
diff --git a/src/test/examplesJava11/nesthostexample/BasicNestHostTreePruning.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostTreePruning.java
similarity index 93%
rename from src/test/examplesJava11/nesthostexample/BasicNestHostTreePruning.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostTreePruning.java
index 484c81a..6928d73 100644
--- a/src/test/examplesJava11/nesthostexample/BasicNestHostTreePruning.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostTreePruning.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import com.android.tools.r8.NeverInline;
 
diff --git a/src/test/examplesJava11/nesthostexample/BasicNestHostWithAnonymousInnerClass.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithAnonymousInnerClass.java
similarity index 96%
rename from src/test/examplesJava11/nesthostexample/BasicNestHostWithAnonymousInnerClass.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithAnonymousInnerClass.java
index 93ad558..cd9a474 100644
--- a/src/test/examplesJava11/nesthostexample/BasicNestHostWithAnonymousInnerClass.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithAnonymousInnerClass.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import java.util.List;
 
diff --git a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassConstructors.java
similarity index 97%
rename from src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassConstructors.java
index 80fe3fe..744599b 100644
--- a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassConstructors.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import java.util.List;
 
diff --git a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassFields.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassFields.java
similarity index 96%
rename from src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassFields.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassFields.java
index 070d886..83d536a 100644
--- a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassFields.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassFields.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import java.util.List;
 
diff --git a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassMethods.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassMethods.java
similarity index 96%
rename from src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassMethods.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassMethods.java
index 2766914..c1b50c8 100644
--- a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassMethods.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/BasicNestHostWithInnerClassMethods.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import java.util.List;
 
diff --git a/src/test/examplesJava11/nesthostexample/FullNestOnProgramPathTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/FullNestOnProgramPathTest.java
similarity index 99%
rename from src/test/examplesJava11/nesthostexample/FullNestOnProgramPathTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/FullNestOnProgramPathTest.java
index 5bc8808..d7aaad1 100644
--- a/src/test/examplesJava11/nesthostexample/FullNestOnProgramPathTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/FullNestOnProgramPathTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
diff --git a/src/test/examplesJava11/nesthostexample/NestAttributesUpdateTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestAttributesUpdateTest.java
similarity index 89%
rename from src/test/examplesJava11/nesthostexample/NestAttributesUpdateTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestAttributesUpdateTest.java
index ecac6fb..15e6b6a 100644
--- a/src/test/examplesJava11/nesthostexample/NestAttributesUpdateTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestAttributesUpdateTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertFalse;
@@ -31,7 +31,6 @@
 
 @RunWith(Parameterized.class)
 public class NestAttributesUpdateTest extends TestBase {
-  private static final String PACKAGE_NAME = "nesthostexample.";
 
   private static final Class<?> MERGING_OUTER_CLASS = BasicNestHostClassMerging.class;
   private static final Class<?> PRUNING_OUTER_CLASS = BasicNestHostTreePruning.class;
@@ -133,7 +132,7 @@
             })
         .addProgramClassesAndInnerClasses(outerNestClass)
         .applyIf(parameters.isCfRuntime(), Jdk9TestUtils.addJdk9LibraryFiles(temp))
-        .addKeepPackageNamesRule("nesthostexample")
+        .addKeepPackageNamesRule(getClass().getPackageName())
         .addInliningAnnotations()
         .apply(testBuilderConsumer)
         .compile()
@@ -154,19 +153,25 @@
         if (clazz.isNestHost()) {
           // All members are present with the clazz as host
           for (NestMemberClassAttribute attr : clazz.getNestMembersClassAttributes()) {
-            String memberName = attr.getNestMember().getName();
-            ClassSubject inner = inspector.clazz(PACKAGE_NAME + memberName);
+            ClassSubject inner = inspector.clazz(attr.getNestMember().toSourceString());
             assertNotNull(
-                "The nest member " + memberName + " of " + clazz.type.getName() + " is missing",
+                "The nest member "
+                    + attr.getNestMember().toSourceString()
+                    + " of "
+                    + clazz.type.toSourceString()
+                    + " is missing",
                 inner.getDexProgramClass());
             assertSame(inner.getDexProgramClass().getNestHost(), clazz.type);
           }
         } else {
           // Nest host is present and with the clazz as member
-          String hostName = clazz.getNestHost().getName();
-          ClassSubject host = inspector.clazz(PACKAGE_NAME + hostName);
+          ClassSubject host = inspector.clazz(clazz.getNestHost().toSourceString());
           assertNotNull(
-              "The nest host " + hostName + " of " + clazz.type.getName() + " is missing",
+              "The nest host "
+                  + clazz.getNestHost().toSourceString()
+                  + " of "
+                  + clazz.type.toSourceString()
+                  + " is missing",
               host.getDexProgramClass());
           assertTrue(
               host.getDexProgramClass().getNestMembersClassAttributes().stream()
diff --git a/src/test/examplesJava11/nesthostexample/NestClassMergingTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestClassMergingTest.java
similarity index 98%
rename from src/test/examplesJava11/nesthostexample/NestClassMergingTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestClassMergingTest.java
index 273b7ec..e1af3fb 100644
--- a/src/test/examplesJava11/nesthostexample/NestClassMergingTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestClassMergingTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import com.android.tools.r8.Jdk9TestUtils;
 import com.android.tools.r8.R8TestCompileResult;
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestCompilationExceptionTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestCompilationExceptionTest.java
similarity index 77%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestCompilationExceptionTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestCompilationExceptionTest.java
index ec66458..26b7a21 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestCompilationExceptionTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestCompilationExceptionTest.java
@@ -2,15 +2,9 @@
 // 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
-import static com.android.tools.r8.desugar.nestaccesscontrol.NestAccessControlTestUtils.CLASSES_PATH;
-import static com.android.tools.r8.desugar.nestaccesscontrol.NestAccessControlTestUtils.CLASS_NAMES;
-import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
-import static java.util.stream.Collectors.toList;
-import static org.hamcrest.core.StringContains.containsString;
-import static org.hamcrest.core.StringEndsWith.endsWith;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -29,9 +23,6 @@
 import com.android.tools.r8.errors.InterfaceDesugarMissingTypeDiagnostic;
 import com.android.tools.r8.errors.MissingNestHostNestDesugarDiagnostic;
 import com.android.tools.r8.references.Reference;
-import java.nio.file.Path;
-import java.util.List;
-import org.hamcrest.Matcher;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -77,27 +68,20 @@
     testIncompleteNestError(false);
   }
 
-  private TestCompilerBuilder<?, ?, ?, ?, ?> compileOnlyClassesMatching(
-      Matcher<String> matcher,
+  private TestCompilerBuilder<?, ?, ?, ?, ?> configureTestBuilder(
+      Class<?> clazz,
       boolean d8,
       boolean allowDiagnosticWarningMessages,
       boolean ignoreMissingClasses) {
-    List<Path> matchingClasses =
-        CLASS_NAMES.stream()
-            .filter(matcher::matches)
-            .map(name -> CLASSES_PATH.resolve(name + CLASS_EXTENSION))
-            .collect(toList());
     if (d8) {
-      return testForD8(parameters.getBackend())
-          .setMinApi(parameters)
-          .addProgramFiles(matchingClasses);
+      return testForD8(parameters.getBackend()).setMinApi(parameters).addProgramClasses(clazz);
     } else {
       return testForR8(parameters.getBackend())
           .addDontShrink()
           .addDontObfuscate()
           .addKeepAllAttributes()
           .setMinApi(parameters)
-          .addProgramFiles(matchingClasses)
+          .addProgramClasses(clazz)
           .applyIf(parameters.isCfRuntime(), Jdk9TestUtils.addJdk9LibraryFiles(temp))
           .addIgnoreWarnings(ignoreMissingClasses)
           .allowDiagnosticWarningMessages(allowDiagnosticWarningMessages);
@@ -106,9 +90,8 @@
 
   private void testMissingNestHostError(boolean d8) {
     try {
-      Matcher<String> innerClassMatcher =
-          containsString("BasicNestHostWithInnerClassMethods$BasicNestedClass");
-      compileOnlyClassesMatching(innerClassMatcher, d8, false, false)
+      configureTestBuilder(
+              BasicNestHostWithInnerClassMethods.BasicNestedClass.class, d8, false, false)
           .compileWithExpectedDiagnostics(
               diagnostics -> {
                 if (d8) {
@@ -133,8 +116,8 @@
                               diagnostic
                                   .assertIsMissingDefinitionsDiagnostic()
                                   .assertIsMissingClass(
-                                      Reference.classFromTypeName(
-                                          "nesthostexample.BasicNestHostWithInnerClassMethods"))
+                                      Reference.classFromClass(
+                                          BasicNestHostWithInnerClassMethods.class))
                                   .assertNumberOfMissingClasses(1));
                 }
               });
@@ -147,8 +130,7 @@
 
   private void testIncompleteNestError(boolean d8) {
     try {
-      Matcher<String> innerClassMatcher = endsWith("BasicNestHostWithInnerClassMethods");
-      compileOnlyClassesMatching(innerClassMatcher, d8, false, false)
+      configureTestBuilder(BasicNestHostWithInnerClassMethods.class, d8, false, false)
           .compileWithExpectedDiagnostics(
               diagnostics -> {
                 if (d8) {
@@ -161,10 +143,11 @@
                   IncompleteNestNestDesugarDiagnosic diagnostic =
                       (IncompleteNestNestDesugarDiagnosic) diagnostics.getErrors().get(0);
                   assertEquals(
-                      "Compilation of classes nesthostexample.BasicNestHostWithInnerClassMethods "
-                          + "requires its nest mates "
-                          + "nesthostexample.BasicNestHostWithInnerClassMethods$BasicNestedClass "
-                          + "(unavailable) to be on program or class path.",
+                      "Compilation of classes "
+                          + BasicNestHostWithInnerClassMethods.class.getTypeName()
+                          + " requires its nest mates "
+                          + BasicNestHostWithInnerClassMethods.BasicNestedClass.class.getTypeName()
+                          + " (unavailable) to be on program or class path.",
                       diagnostic.getDiagnosticMessage());
                 } else {
                   diagnostics
@@ -187,10 +170,10 @@
   }
 
   private void testMissingNestHostWarning(boolean d8, boolean desugarWarning) throws Exception {
-    Matcher<String> innerClassMatcher =
-        containsString("BasicNestHostWithInnerClassMethods$BasicNestedClass");
     TestCompileResult<?, ?> compileResult =
-        compileOnlyClassesMatching(innerClassMatcher, d8, !d8, true).compile();
+        configureTestBuilder(
+                BasicNestHostWithInnerClassMethods.BasicNestedClass.class, d8, !d8, true)
+            .compile();
     assertTrue(compileResult.getDiagnosticMessages().getWarnings().size() >= 1);
     if (d8 && desugarWarning) {
       assertTrue(
@@ -216,17 +199,15 @@
                     diagnostic
                         .assertIsMissingDefinitionsDiagnostic()
                         .assertIsMissingClass(
-                            Reference.classFromTypeName(
-                                "nesthostexample.BasicNestHostWithInnerClassMethods"))
+                            Reference.classFromClass(BasicNestHostWithInnerClassMethods.class))
                         .assertNumberOfMissingClasses(1));
           });
     }
   }
 
   private void testIncompleteNestWarning(boolean d8, boolean desugarWarning) throws Exception {
-    Matcher<String> innerClassMatcher = endsWith("BasicNestHostWithInnerClassMethods");
     TestCompileResult<?, ?> compileResult =
-        compileOnlyClassesMatching(innerClassMatcher, d8, !d8, true).compile();
+        configureTestBuilder(BasicNestHostWithInnerClassMethods.class, d8, !d8, true).compile();
     assertTrue(compileResult.getDiagnosticMessages().getWarnings().size() >= 1);
     if (d8 && desugarWarning) {
       assertTrue(
@@ -252,8 +233,8 @@
                     diagnostic
                         .assertIsMissingDefinitionsDiagnostic()
                         .assertIsMissingClass(
-                            Reference.classFromTypeName(
-                                "nesthostexample.BasicNestHostWithInnerClassMethods$BasicNestedClass"))
+                            Reference.classFromClass(
+                                BasicNestHostWithInnerClassMethods.BasicNestedClass.class))
                         .assertNumberOfMissingClasses(1));
           });
     }
diff --git a/src/test/examplesJava11/nesthostexample/NestConstructorRemovedArgTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestConstructorRemovedArgTest.java
similarity index 93%
rename from src/test/examplesJava11/nesthostexample/NestConstructorRemovedArgTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestConstructorRemovedArgTest.java
index 216673a..36ad284 100644
--- a/src/test/examplesJava11/nesthostexample/NestConstructorRemovedArgTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestConstructorRemovedArgTest.java
@@ -2,9 +2,9 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
-import static nesthostexample.BasicNestHostWithInnerClassConstructors.getExpectedResult;
+import static com.android.tools.r8.jdk11.desugar.nest.BasicNestHostWithInnerClassConstructors.getExpectedResult;
 
 import com.android.tools.r8.Jdk9TestUtils;
 import com.android.tools.r8.TestBase;
diff --git a/src/test/examplesJava11/nesthostexample/NestHostExample.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostExample.java
similarity index 99%
rename from src/test/examplesJava11/nesthostexample/NestHostExample.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostExample.java
index b892be3..2d908b1 100644
--- a/src/test/examplesJava11/nesthostexample/NestHostExample.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostExample.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import java.util.List;
 
diff --git a/src/test/examplesJava11/nesthostexample/NestHostInlining.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostInlining.java
similarity index 94%
rename from src/test/examplesJava11/nesthostexample/NestHostInlining.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostInlining.java
index 4748927..1ca8c17 100644
--- a/src/test/examplesJava11/nesthostexample/NestHostInlining.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostInlining.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 public class NestHostInlining {
 
diff --git a/src/test/examplesJava11/nesthostexample/NestHostInliningSubclasses.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostInliningSubclasses.java
similarity index 94%
rename from src/test/examplesJava11/nesthostexample/NestHostInliningSubclasses.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostInliningSubclasses.java
index 4221307..b862e57 100644
--- a/src/test/examplesJava11/nesthostexample/NestHostInliningSubclasses.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestHostInliningSubclasses.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import com.android.tools.r8.NeverInline;
 
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestInitArgumentContextClass.java
similarity index 92%
rename from src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestInitArgumentContextClass.java
index cc8b8f3..73aaae8 100644
--- a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestInitArgumentContextClass.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 class NestInitArgumentContextClass {
   public class Inner1 {
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestInitArgumentContextTest.java
similarity index 98%
rename from src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestInitArgumentContextTest.java
index 2de3600..8041082 100644
--- a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestInitArgumentContextTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import static org.junit.Assert.assertEquals;
 
diff --git a/src/test/examplesJava11/nesthostexample/NestMemberPropagatedTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestMemberPropagatedTest.java
similarity index 97%
rename from src/test/examplesJava11/nesthostexample/NestMemberPropagatedTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestMemberPropagatedTest.java
index dc1a1d3..a6a00ec 100644
--- a/src/test/examplesJava11/nesthostexample/NestMemberPropagatedTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestMemberPropagatedTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import static junit.framework.TestCase.assertEquals;
 
diff --git a/src/test/examplesJava11/nesthostexample/NestMethodInlinedTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestMethodInlinedTest.java
similarity index 98%
rename from src/test/examplesJava11/nesthostexample/NestMethodInlinedTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestMethodInlinedTest.java
index ef93446..791d1fc 100644
--- a/src/test/examplesJava11/nesthostexample/NestMethodInlinedTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestMethodInlinedTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertTrue;
diff --git a/src/test/examplesJava11/nesthostexample/NestOnProgramAndClasspathAndLibraryTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestOnProgramAndClasspathAndLibraryTest.java
similarity index 98%
rename from src/test/examplesJava11/nesthostexample/NestOnProgramAndClasspathAndLibraryTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestOnProgramAndClasspathAndLibraryTest.java
index 767b7df..e720d8b 100644
--- a/src/test/examplesJava11/nesthostexample/NestOnProgramAndClasspathAndLibraryTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestOnProgramAndClasspathAndLibraryTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import static org.junit.Assert.assertThrows;
 
diff --git a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestOnProgramOnClassPathTest.java
similarity index 98%
rename from src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestOnProgramOnClassPathTest.java
index 974683a..1bb55a2 100644
--- a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestOnProgramOnClassPathTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
diff --git a/src/test/examplesJava11/nesthostexample/NestPvtFieldPropagated.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestPvtFieldPropagated.java
similarity index 89%
rename from src/test/examplesJava11/nesthostexample/NestPvtFieldPropagated.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestPvtFieldPropagated.java
index 2cbdf25..05579e2 100644
--- a/src/test/examplesJava11/nesthostexample/NestPvtFieldPropagated.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestPvtFieldPropagated.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 public class NestPvtFieldPropagated {
 
diff --git a/src/test/examplesJava11/nesthostexample/NestPvtMethodCallInlined.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestPvtMethodCallInlined.java
similarity index 97%
rename from src/test/examplesJava11/nesthostexample/NestPvtMethodCallInlined.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestPvtMethodCallInlined.java
index 9670e69..6944b3c 100644
--- a/src/test/examplesJava11/nesthostexample/NestPvtMethodCallInlined.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/NestPvtMethodCallInlined.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 import com.android.tools.r8.AlwaysInline;
 import com.android.tools.r8.NeverInline;
diff --git a/src/test/examplesJava11/nesthostexample/OutsideInliningNoAccess.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/OutsideInliningNoAccess.java
similarity index 88%
rename from src/test/examplesJava11/nesthostexample/OutsideInliningNoAccess.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/OutsideInliningNoAccess.java
index 86da4b1..55cad20 100644
--- a/src/test/examplesJava11/nesthostexample/OutsideInliningNoAccess.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/OutsideInliningNoAccess.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 public class OutsideInliningNoAccess extends NestHostInlining.EmptyNoPrivAccess {
 
diff --git a/src/test/examplesJava11/nesthostexample/OutsideInliningWithAccess.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/OutsideInliningWithAccess.java
similarity index 90%
rename from src/test/examplesJava11/nesthostexample/OutsideInliningWithAccess.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/OutsideInliningWithAccess.java
index c81e437..f6b8dce 100644
--- a/src/test/examplesJava11/nesthostexample/OutsideInliningWithAccess.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/OutsideInliningWithAccess.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest;
 
 public class OutsideInliningWithAccess extends NestHostInlining.EmptyWithPrivAccess {
 
diff --git a/src/test/examplesJava11/com/android/tools/r8/shaking/b169045091/examples/NestHost.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NestHost.java
similarity index 83%
rename from src/test/examplesJava11/com/android/tools/r8/shaking/b169045091/examples/NestHost.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NestHost.java
index 5c1453e..d49dcfe 100644
--- a/src/test/examplesJava11/com/android/tools/r8/shaking/b169045091/examples/NestHost.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NestHost.java
@@ -2,7 +2,7 @@
 // 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.shaking.b169045091.examples;
+package com.android.tools.r8.jdk11.desugar.nest.b169045091;
 
 public class NestHost {
   /*private*/ int f;
diff --git a/src/test/examplesJava11/nesthostexample/b169045091/NestMemberAccessibilityTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NestMemberAccessibilityTest.java
similarity index 94%
rename from src/test/examplesJava11/nesthostexample/b169045091/NestMemberAccessibilityTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NestMemberAccessibilityTest.java
index 71e5b47..6f14432 100644
--- a/src/test/examplesJava11/nesthostexample/b169045091/NestMemberAccessibilityTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NestMemberAccessibilityTest.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample.b169045091;
+package com.android.tools.r8.jdk11.desugar.nest.b169045091;
 
 import static com.android.tools.r8.references.Reference.INT;
 import static org.junit.Assert.assertTrue;
@@ -15,11 +15,9 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.jdk11.desugar.nest.b169045091.NestHost.NestMember;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.shaking.b169045091.examples.NestHost;
-import com.android.tools.r8.shaking.b169045091.examples.NestHost.NestMember;
-import com.android.tools.r8.shaking.b169045091.examples.NonNestMember;
 import com.android.tools.r8.utils.AndroidApp;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/src/test/examplesJava11/com/android/tools/r8/shaking/b169045091/examples/NonNestMember.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NonNestMember.java
similarity index 81%
rename from src/test/examplesJava11/com/android/tools/r8/shaking/b169045091/examples/NonNestMember.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NonNestMember.java
index 02fd5e7..f5923f6 100644
--- a/src/test/examplesJava11/com/android/tools/r8/shaking/b169045091/examples/NonNestMember.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/b169045091/NonNestMember.java
@@ -2,6 +2,6 @@
 // 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.shaking.b169045091.examples;
+package com.android.tools.r8.jdk11.desugar.nest.b169045091;
 
 public class NonNestMember extends NestHost.NestMember {}
diff --git a/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/Host.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/Host.java
new file mode 100644
index 0000000..72e8cd9
--- /dev/null
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/Host.java
@@ -0,0 +1,11 @@
+// Copyright (c) 2024, 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.jdk11.desugar.nest.dex;
+
+class Host {
+
+  static class Member1 {}
+
+  static class Member2 {}
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeInterfaceTest.java
similarity index 99%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeInterfaceTest.java
index bb32170..6442bab 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeInterfaceTest.java
@@ -1,7 +1,7 @@
 // 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static org.hamcrest.CoreMatchers.containsString;
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSpecialTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeSpecialTest.java
similarity index 89%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSpecialTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeSpecialTest.java
index 220f6c0..22b02be 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSpecialTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeSpecialTest.java
@@ -1,9 +1,8 @@
 // Copyright (c) 2023, 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.google.common.base.Predicates.alwaysTrue;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -11,16 +10,14 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.function.Predicate;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,16 +28,12 @@
 @RunWith(Parameterized.class)
 public class NestAttributesInDexRewriteInvokeSpecialTest extends NestAttributesInDexTestBase {
 
-  private static final Path JDK17_JAR =
-      Paths.get(ToolHelper.TESTS_BUILD_DIR, "examplesJava11")
-          .resolve("nesthostexample" + JAR_EXTENSION);
-  private static final String MAIN = "nesthostexample.NestHierachy";
-
-  @Parameter() public TestParameters parameters;
+  @Parameter(0)
+  public TestParameters parameters;
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withAllRuntimes().withAllApiLevels().build();
+    return TestBase.getTestParameters().withAllRuntimes().withAllApiLevels().build();
   }
 
   private static final String EXPECTED_OUTPUT =
@@ -51,8 +44,8 @@
   public void testRuntime() throws Exception {
     assumeTrue(parameters.isCfRuntime() && isRuntimeWithNestSupport(parameters.asCfRuntime()));
     testForJvm(parameters)
-        .addProgramFiles(JDK17_JAR)
-        .run(parameters.getRuntime(), MAIN)
+        .addProgramClassesAndInnerClasses(NestHierachy.class)
+        .run(parameters.getRuntime(), NestHierachy.class)
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
@@ -60,10 +53,10 @@
   public void testD8() throws Exception {
     parameters.assumeDexRuntime();
     testForD8()
-        .addProgramFiles(JDK17_JAR)
+        .addProgramClassesAndInnerClasses(NestHierachy.class)
         .setMinApi(parameters)
         .compile()
-        .run(parameters.getRuntime(), MAIN)
+        .run(parameters.getRuntime(), NestHierachy.class)
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
@@ -174,13 +167,13 @@
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
     assertFalse(parameters.getApiLevel().getLevel() > 35);
     testForD8()
-        .addProgramFiles(JDK17_JAR)
+        .addProgramClassesAndInnerClasses(NestHierachy.class)
         .setMinApi(AndroidApiLevel.U)
         .addOptionsModification(options -> options.emitNestAnnotationsInDex = true)
         .compile()
         .inspect(
             inspector -> {
-              ClassSubject innerSub = inspector.clazz("nesthostexample.NestHierachy$InnerSub");
+              ClassSubject innerSub = inspector.clazz(NestHierachy.InnerSub.class);
               assertThat(innerSub, isPresent());
               // invokespecial on public super.
               assertSingleInvokeSuper(innerSub.uniqueMethodWithOriginalName("m1"));
@@ -193,7 +186,7 @@
               assertSingleInvokeStatic(innerSub.uniqueMethodWithOriginalName("s2"));
 
               // invoke-virtual on public nest members, invoke-direct on private nest members
-              ClassSubject outer = inspector.clazz("nesthostexample.NestHierachy");
+              ClassSubject outer = inspector.clazz(NestHierachy.class);
               assertThat(outer, isPresent());
               MethodSubject callOnInnerSuper =
                   outer.uniqueMethodWithOriginalName("callOnInnerSuper");
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSuperTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeSuperTest.java
similarity index 99%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSuperTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeSuperTest.java
index 1894fa6..28967bd 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSuperTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeSuperTest.java
@@ -1,7 +1,7 @@
 // Copyright (c) 2023, 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static org.hamcrest.CoreMatchers.containsString;
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeVirtualTest.java
similarity index 99%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeVirtualTest.java
index d2c83a5..f032116 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexRewriteInvokeVirtualTest.java
@@ -1,7 +1,7 @@
 // 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static org.hamcrest.CoreMatchers.containsString;
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingFieldsTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexShrinkingFieldsTest.java
similarity index 99%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingFieldsTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexShrinkingFieldsTest.java
index 790498d..abd2a73 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingFieldsTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexShrinkingFieldsTest.java
@@ -1,7 +1,7 @@
 // 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingMethodsTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexShrinkingMethodsTest.java
similarity index 99%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingMethodsTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexShrinkingMethodsTest.java
index 677e553..8aa6865 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingMethodsTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexShrinkingMethodsTest.java
@@ -1,7 +1,7 @@
 // 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexTest.java
similarity index 96%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexTest.java
index 43668e8..c0c8a15 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexTest.java
@@ -1,7 +1,7 @@
 // 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -14,8 +14,8 @@
 import com.android.tools.r8.TestRunResult;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDexTest.Host.Member1;
-import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDexTest.Host.Member2;
+import com.android.tools.r8.jdk11.desugar.nest.dex.Host.Member1;
+import com.android.tools.r8.jdk11.desugar.nest.dex.Host.Member2;
 import com.android.tools.r8.transformers.ClassFileTransformer;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -116,6 +116,8 @@
     parameters.assumeDexRuntime();
     testForD8()
         .addProgramClassFileData(getTransformedClasses())
+        .addStrippedOuter(getClass())
+        .addClasspathClasses(AdditionalClassAPIs.class)
         .addProgramClasses(OtherHost.class)
         .setMinApi(parameters)
         .addOptionsModification(options -> options.emitNestAnnotationsInDex = true)
@@ -146,6 +148,7 @@
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     testForR8(parameters.getBackend())
         .addProgramClassFileData(getTransformedClasses())
+        .addStrippedOuter(getClass())
         .addProgramClasses(OtherHost.class)
         .setMinApi(parameters)
         .addOptionsModification(options -> options.emitNestAnnotationsInDex = true)
@@ -165,6 +168,7 @@
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     testForR8(parameters.getBackend())
         .addProgramClassFileData(getTransformedClasses())
+        .addStrippedOuter(getClass())
         .addProgramClasses(OtherHost.class)
         .setMinApi(parameters)
         .addOptionsModification(options -> options.emitNestAnnotationsInDex = true)
@@ -186,6 +190,7 @@
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     testForR8(parameters.getBackend())
         .addProgramClassFileData(getTransformedClasses())
+        .addStrippedOuter(getClass())
         .addProgramClasses(OtherHost.class)
         .setMinApi(parameters)
         .addOptionsModification(options -> options.emitNestAnnotationsInDex = true)
@@ -207,6 +212,7 @@
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     testForR8(parameters.getBackend())
         .addProgramClassFileData(getTransformedClasses())
+        .addStrippedOuter(getClass())
         .addProgramClasses(OtherHost.class)
         .setMinApi(parameters)
         .addOptionsModification(options -> options.emitNestAnnotationsInDex = true)
@@ -321,12 +327,4 @@
       System.out.println(AdditionalClassAPIs.isNestmateOf(OtherHost.class, OtherHost.class));
     }
   }
-
-  static class OtherHost {}
-
-  static class Host {
-    static class Member1 {}
-
-    static class Member2 {}
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTestBase.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexTestBase.java
similarity index 94%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTestBase.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexTestBase.java
index 9f67110..0834659 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTestBase.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesInDexTestBase.java
@@ -1,7 +1,7 @@
 // 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestRuntime;
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesNotInDexWithForceNestDesugaringTest.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesNotInDexWithForceNestDesugaringTest.java
similarity index 93%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesNotInDexWithForceNestDesugaringTest.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesNotInDexWithForceNestDesugaringTest.java
index 86eff4e..ca9a44e 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesNotInDexWithForceNestDesugaringTest.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestAttributesNotInDexWithForceNestDesugaringTest.java
@@ -1,7 +1,7 @@
 // Copyright (c) 2023, 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentIf;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -10,9 +10,9 @@
 
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesNotInDexWithForceNestDesugaringTest.Host.Member1;
-import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesNotInDexWithForceNestDesugaringTest.Host.Member2;
 import com.android.tools.r8.graph.MethodAccessFlags;
+import com.android.tools.r8.jdk11.desugar.nest.dex.NestAttributesNotInDexWithForceNestDesugaringTest.Host.Member1;
+import com.android.tools.r8.jdk11.desugar.nest.dex.NestAttributesNotInDexWithForceNestDesugaringTest.Host.Member2;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.transformers.ClassFileTransformer;
 import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
diff --git a/src/test/examplesJava11/nesthostexample/NestHierachy.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestHierachy.java
similarity index 96%
rename from src/test/examplesJava11/nesthostexample/NestHierachy.java
rename to src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestHierachy.java
index ba971d2..10d024a 100644
--- a/src/test/examplesJava11/nesthostexample/NestHierachy.java
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/NestHierachy.java
@@ -2,7 +2,7 @@
 // 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 nesthostexample;
+package com.android.tools.r8.jdk11.desugar.nest.dex;
 
 public class NestHierachy {
   abstract static class InnerSuper {
diff --git a/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/OtherHost.java b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/OtherHost.java
new file mode 100644
index 0000000..907e038
--- /dev/null
+++ b/src/test/examplesJava11/com/android/tools/r8/jdk11/desugar/nest/dex/OtherHost.java
@@ -0,0 +1,6 @@
+// Copyright (c) 2024, 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.jdk11.desugar.nest.dex;
+
+class OtherHost {}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java
deleted file mode 100644
index cba6309..0000000
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (c) 2019, 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.desugar.nestaccesscontrol;
-
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
-import com.android.tools.r8.ToolHelper;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-
-public class NestAccessControlTestUtils {
-
-  public static final Path JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR).resolve("nesthostexample" + JAR_EXTENSION);
-  public static final Path CLASSES_PATH =
-      Paths.get(ToolHelper.getExamplesJava11BuildDir()).resolve("nesthostexample/");
-
-  public static final List<String> CLASS_NAMES =
-      ImmutableList.of(
-          "BasicNestHostWithInnerClassFields",
-          "BasicNestHostWithInnerClassFields$BasicNestedClass",
-          "BasicNestHostWithInnerClassMethods",
-          "BasicNestHostWithInnerClassMethods$BasicNestedClass",
-          "BasicNestHostWithInnerClassConstructors",
-          "BasicNestHostWithInnerClassConstructors$BasicNestedClass",
-          "BasicNestHostWithInnerClassConstructors$UnInstantiatedClass",
-          "BasicNestHostWithAnonymousInnerClass",
-          "BasicNestHostWithAnonymousInnerClass$1",
-          "BasicNestHostWithAnonymousInnerClass$InterfaceForAnonymousClass",
-          "BasicNestHostClassMerging",
-          "BasicNestHostClassMerging$MiddleInner",
-          "BasicNestHostClassMerging$MiddleOuter",
-          "BasicNestHostClassMerging$InnerMost",
-          "BasicNestHostTreePruning",
-          "BasicNestHostTreePruning$Pruned",
-          "BasicNestHostTreePruning$NotPruned",
-          "NestHostInlining",
-          "NestHostInlining$InnerWithPrivAccess",
-          "NestHostInlining$InnerNoPrivAccess",
-          "NestHostInlining$EmptyNoPrivAccess",
-          "NestHostInlining$EmptyWithPrivAccess",
-          "NestHostInliningSubclasses",
-          "NestHostInliningSubclasses$InnerWithPrivAccess",
-          "NestHostInliningSubclasses$InnerNoPrivAccess",
-          "OutsideInliningNoAccess",
-          "OutsideInliningWithAccess",
-          "NestPvtMethodCallInlined",
-          "NestPvtMethodCallInlined$Inner",
-          "NestPvtMethodCallInlined$InnerInterface",
-          "NestPvtMethodCallInlined$InnerInterfaceImpl",
-          "NestPvtMethodCallInlined$InnerSub",
-          "NestPvtFieldPropagated",
-          "NestPvtFieldPropagated$Inner",
-          "NestHostExample",
-          "NestHostExample$NestMemberInner",
-          "NestHostExample$NestMemberInner$NestMemberInnerInner",
-          "NestHostExample$StaticNestMemberInner",
-          "NestHostExample$StaticNestMemberInner$StaticNestMemberInnerInner",
-          "NestHostExample$StaticNestInterfaceInner",
-          "NestHostExample$ExampleEnumCompilation");
-  public static final ImmutableMap<String, String> MAIN_CLASSES =
-      ImmutableMap.<String, String>builder()
-          .put("fields", "BasicNestHostWithInnerClassFields")
-          .put("methods", "BasicNestHostWithInnerClassMethods")
-          .put("constructors", "BasicNestHostWithInnerClassConstructors")
-          .put("anonymous", "BasicNestHostWithAnonymousInnerClass")
-          .put("all", "NestHostExample")
-          .put("merge", "BasicNestHostClassMerging")
-          .put("prune", "BasicNestHostTreePruning")
-          .put("inlining", "NestHostInlining")
-          .put("inliningSub", "NestHostInliningSubclasses")
-          .put("pvtCallInlined", "NestPvtMethodCallInlined")
-          .put("memberPropagated", "NestPvtFieldPropagated")
-          .build();
-
-  public static String getMainClass(String id) {
-    return "nesthostexample." + MAIN_CLASSES.get(id);
-  }
-
-
-}
