diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingTest.java
index 02a4fe6..f5959e8 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingTest.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.apimodel.ApiModelingTestHelper;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
@@ -79,8 +78,6 @@
         .addKeepMainRule(Main.class)
         .addArtProfileForRewriting(getArtProfile())
         .apply(setMockApiLevelForClass(LibraryClass.class, classApiLevel))
-        .apply(ApiModelingTestHelper::enableApiCallerIdentification)
-        .apply(ApiModelingTestHelper::enableOutliningOfMethods)
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspectResidualArtProfile(this::inspect)
@@ -104,7 +101,7 @@
         .hasConstClassOutlinedFromUntil(
             Main.class.getMethod("main", String[].class), classApiLevel);
 
-    // Check outline was added to ART profile.
+    // Check outline was added to program.
     ClassSubject apiOutlineClassSubject =
         inspector.clazz(SyntheticItemsTestUtils.syntheticApiOutlineClass(Main.class, 0));
     assertThat(apiOutlineClassSubject, notIf(isPresent(), isLibraryClassAlwaysPresent()));
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
index 81a74af..e376dbc 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.profile.art.completeness.NestBasedAccessBridgesProfileRewritingTest.Main.NestMember;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.MethodReferenceUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -59,6 +60,7 @@
         .addProgramClassFileData(getProgramClassFileData())
         .addKeepMainRule(Main.class)
         .addArtProfileForRewriting(getArtProfile())
+        .addOptionsModification(options -> options.callSiteOptimizationOptions().setEnabled(false))
         .enableInliningAnnotations()
         .setMinApi(parameters.getApiLevel())
         .compile()
@@ -72,6 +74,7 @@
         transformer(Main.class).setNest(Main.class, NestMember.class).transform(),
         transformer(NestMember.class)
             .setNest(Main.class, NestMember.class)
+            .setPrivate(NestMember.class.getDeclaredConstructor())
             .setPrivate(NestMember.class.getDeclaredField("instanceField"))
             .setPrivate(NestMember.class.getDeclaredField("staticField"))
             .setPrivate(NestMember.class.getDeclaredMethod("instanceMethod"))
@@ -90,6 +93,14 @@
     ClassSubject nestMemberClassSubject = inspector.clazz(NestMember.class);
     assertThat(nestMemberClassSubject, isPresent());
 
+    ClassSubject syntheticConstructorArgumentClassSubject =
+        inspector.clazz(
+            SyntheticItemsTestUtils.syntheticNestConstructorArgumentClass(
+                Reference.classFromClass(NestMember.class)));
+    assertThat(
+        syntheticConstructorArgumentClassSubject,
+        notIf(isPresent(), parameters.canUseNestBasedAccesses()));
+
     MethodSubject syntheticNestInstanceFieldGetterMethodSubject =
         nestMemberClassSubject.uniqueMethodWithOriginalName(
             SyntheticItemsTestUtils.syntheticNestInstanceFieldGetter(
@@ -144,7 +155,8 @@
         syntheticNestStaticMethodAccessorMethodSubject,
         notIf(isPresent(), parameters.canUseNestBasedAccesses()));
 
-    // TODO(b/265729283): Should contain the nest bridge methods.
+    // TODO(b/265729283): Should contain the nest bridge methods and the synthesized constructor
+    //  argument class.
     profileInspector
         .assertContainsMethodRule(MethodReferenceUtils.mainMethod(Main.class))
         .assertContainsNoOtherRules();
@@ -167,6 +179,8 @@
       /*private*/ int instanceField;
       /*private*/ static int staticField;
 
+      /*private*/ NestMember() {}
+
       @NeverInline
       /*private*/ int instanceMethod() {
         return System.currentTimeMillis() > 0 ? 2 : 0;
diff --git a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
index 19ed989..cf968ea 100644
--- a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
+++ b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
@@ -146,6 +146,13 @@
         originalMethod.getMethodDescriptor());
   }
 
+  public static ClassReference syntheticNestConstructorArgumentClass(
+      ClassReference classReference) {
+    return Reference.classFromDescriptor(
+        SyntheticNaming.createDescriptor(
+            "", naming.INIT_TYPE_ARGUMENT, classReference.getBinaryName(), ""));
+  }
+
   public static MethodReference syntheticNestInstanceFieldGetter(Field field) {
     FieldReference fieldReference = Reference.fieldFromField(field);
     return Reference.method(
diff --git a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java b/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
index 7742119..4adbc9a 100644
--- a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
+++ b/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
@@ -502,14 +502,22 @@
     return setAccessFlags(method, MethodAccessFlags::setBridge);
   }
 
+  public ClassFileTransformer setPrivate(Constructor<?> constructor) {
+    return setAccessFlags(constructor, ClassFileTransformer::setPrivate);
+  }
+
   public ClassFileTransformer setPrivate(Field field) {
-    return setAccessFlags(
-        field,
-        accessFlags -> {
-          accessFlags.setPrivate();
-          accessFlags.unsetProtected();
-          accessFlags.unsetPublic();
-        });
+    return setAccessFlags(field, ClassFileTransformer::setPrivate);
+  }
+
+  public ClassFileTransformer setPrivate(Method method) {
+    return setAccessFlags(method, ClassFileTransformer::setPrivate);
+  }
+
+  private static void setPrivate(AccessFlags<?> accessFlags) {
+    accessFlags.unsetPublic();
+    accessFlags.unsetProtected();
+    accessFlags.setPrivate();
   }
 
   public ClassFileTransformer setPublic(Method method) {
@@ -522,16 +530,6 @@
         });
   }
 
-  public ClassFileTransformer setPrivate(Method method) {
-    return setAccessFlags(
-        method,
-        accessFlags -> {
-          accessFlags.unsetPublic();
-          accessFlags.unsetProtected();
-          accessFlags.setPrivate();
-        });
-  }
-
   public ClassFileTransformer setSynthetic(Method method) {
     return setAccessFlags(method, AccessFlags::setSynthetic);
   }
