diff --git a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
index 0833358..ffbbc4f 100644
--- a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
+++ b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
@@ -88,12 +88,7 @@
               collectStartupItems(startupClass, indexedItemCollection, virtualFileDefinitions),
           startupMethod ->
               collectStartupItems(
-                  startupMethod, indexedItemCollection, virtualFileDefinitions, rewriter),
-          syntheticStartupMethod -> {
-            // All synthetic startup items should be removed after calling
-            // StartupOrder#toStartupOrderForWriting.
-            assert false;
-          });
+                  startupMethod, indexedItemCollection, virtualFileDefinitions, rewriter));
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 692192d..ef76e8a 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -30,7 +30,6 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.MainDexInfo;
-import com.android.tools.r8.synthesis.SyntheticItems;
 import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
@@ -1279,12 +1278,11 @@
       public static PackageSplitClassPartioning create(
           Collection<DexProgramClass> classes,
           Map<DexProgramClass, String> originalNames,
-          StartupOrder startupOrder,
-          SyntheticItems syntheticItems) {
+          StartupOrder startupOrder) {
         return create(
             classes,
             getClassesByPackageComparator(originalNames),
-            getStartupClassPredicate(startupOrder, syntheticItems));
+            getStartupClassPredicate(startupOrder));
       }
 
       private static PackageSplitClassPartioning create(
@@ -1335,8 +1333,8 @@
       }
 
       private static Predicate<DexProgramClass> getStartupClassPredicate(
-          StartupOrder startupOrder, SyntheticItems syntheticItems) {
-        return clazz -> startupOrder.contains(clazz.getType(), syntheticItems);
+          StartupOrder startupOrder) {
+        return clazz -> startupOrder.contains(clazz.getType());
       }
 
       public List<DexProgramClass> getStartupClasses() {
@@ -1375,8 +1373,7 @@
         StartupOrder startupOrder,
         IntBox nextFileId) {
       this.classPartioning =
-          PackageSplitClassPartioning.create(
-              classes, originalNames, startupOrder, appView.getSyntheticItems());
+          PackageSplitClassPartioning.create(classes, originalNames, startupOrder);
       this.originalNames = originalNames;
       this.dexItemFactory = appView.dexItemFactory();
       this.options = appView.options();
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
index 032e0b8..ad4d364 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
@@ -19,12 +19,12 @@
   EmptyStartupOrder() {}
 
   @Override
-  public boolean contains(DexMethod method, SyntheticItems syntheticItems) {
+  public boolean contains(DexMethod method) {
     return false;
   }
 
   @Override
-  public boolean contains(DexType type, SyntheticItems syntheticItems) {
+  public boolean contains(DexType type) {
     return false;
   }
 
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
index 25188c0..10dc344 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
@@ -7,86 +7,39 @@
 import com.android.tools.r8.experimental.startup.profile.StartupClass;
 import com.android.tools.r8.experimental.startup.profile.StartupItem;
 import com.android.tools.r8.experimental.startup.profile.StartupMethod;
-import com.android.tools.r8.experimental.startup.profile.SyntheticStartupMethod;
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.PrunedItems;
 import com.android.tools.r8.synthesis.SyntheticItems;
-import com.android.tools.r8.utils.LazyBox;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.LinkedHashMap;
 
 public class NonEmptyStartupOrder extends StartupOrder {
 
-  private final LinkedHashSet<StartupItem> startupItems;
+  private final LinkedHashMap<DexReference, StartupItem> startupItems;
 
-  // Sets to allow efficient querying without boxing.
-  private final Set<DexType> nonSyntheticStartupClasses = Sets.newIdentityHashSet();
-  private final Set<DexType> syntheticStartupClasses = Sets.newIdentityHashSet();
-
-  private final Set<DexMethod> nonSyntheticStartupMethods = Sets.newIdentityHashSet();
-
-  NonEmptyStartupOrder(LinkedHashSet<StartupItem> startupItems) {
+  NonEmptyStartupOrder(LinkedHashMap<DexReference, StartupItem> startupItems) {
     assert !startupItems.isEmpty();
     this.startupItems = startupItems;
-    for (StartupItem startupItem : startupItems) {
-      startupItem.accept(
-          startupClass -> nonSyntheticStartupClasses.add(startupClass.getReference()),
-          startupMethod -> {
-            nonSyntheticStartupClasses.add(startupMethod.getReference().getHolderType());
-            nonSyntheticStartupMethods.add(startupMethod.getReference());
-          },
-          syntheticStartupMethod ->
-              syntheticStartupClasses.add(syntheticStartupMethod.getSyntheticContextType()));
-    }
   }
 
   @Override
-  public boolean contains(DexMethod method, SyntheticItems syntheticItems) {
-    if (nonSyntheticStartupMethods.contains(method)) {
-      return true;
-    }
-    if (syntheticItems.isSyntheticClass(method.getHolderType())) {
-      return containsSyntheticClass(method.getHolderType(), syntheticItems);
-    }
-    return false;
+  public boolean contains(DexMethod method) {
+    return startupItems.containsKey(method);
   }
 
   @Override
-  public boolean contains(DexType type, SyntheticItems syntheticItems) {
-    return syntheticItems.isSyntheticClass(type)
-        ? containsSyntheticClass(type, syntheticItems)
-        : containsNonSyntheticClass(type);
-  }
-
-  private boolean containsNonSyntheticClass(DexType type) {
-    return nonSyntheticStartupClasses.contains(type);
-  }
-
-  private boolean containsSyntheticClass(DexType type, SyntheticItems syntheticItems) {
-    assert syntheticItems.isSyntheticClass(type);
-    return Iterables.any(
-        syntheticItems.getSynthesizingContextTypes(type),
-        this::containsSyntheticClassesSynthesizedFrom);
-  }
-
-  private boolean containsSyntheticClassesSynthesizedFrom(DexType synthesizingContextType) {
-    return syntheticStartupClasses.contains(synthesizingContextType);
+  public boolean contains(DexType type) {
+    return startupItems.containsKey(type);
   }
 
   @Override
   public Collection<StartupItem> getItems() {
-    return startupItems;
+    return startupItems.values();
   }
 
   @Override
@@ -96,27 +49,24 @@
 
   @Override
   public StartupOrder rewrittenWithLens(GraphLens graphLens) {
-    LinkedHashSet<StartupItem> rewrittenStartupItems = new LinkedHashSet<>(startupItems.size());
-    for (StartupItem startupItem : startupItems) {
-      // TODO(b/238173796): This should account for one-to-many mappings. e.g., when a bridge is
+    LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems =
+        new LinkedHashMap<>(startupItems.size());
+    for (StartupItem startupItem : startupItems.values()) {
+      // TODO(b/271822426): This should account for one-to-many mappings. e.g., when a bridge is
       //  created.
       startupItem.apply(
           startupClass ->
-              rewrittenStartupItems.add(
+              rewrittenStartupItems.put(
+                  startupClass.getReference(),
                   StartupClass.builder()
                       .setClassReference(graphLens.lookupType(startupClass.getReference()))
                       .build()),
           startupMethod ->
-              rewrittenStartupItems.add(
+              rewrittenStartupItems.put(
+                  startupMethod.getReference(),
                   StartupMethod.builder()
                       .setMethodReference(
                           graphLens.getRenamedMethodSignature(startupMethod.getReference()))
-                      .build()),
-          syntheticStartupMethod ->
-              rewrittenStartupItems.add(
-                  SyntheticStartupMethod.builder()
-                      .setSyntheticContextReference(
-                          graphLens.lookupType(syntheticStartupMethod.getSyntheticContextType()))
                       .build()));
     }
     return createNonEmpty(rewrittenStartupItems);
@@ -143,49 +93,38 @@
    */
   @Override
   public StartupOrder toStartupOrderForWriting(AppView<?> appView) {
-    LinkedHashSet<StartupItem> rewrittenStartupItems = new LinkedHashSet<>(startupItems.size());
-    Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses =
-        appView.getSyntheticItems().computeSyntheticContextsToSyntheticClasses(appView);
-    for (StartupItem startupItem : startupItems) {
-      addStartupItem(
-          startupItem, rewrittenStartupItems, syntheticContextsToSyntheticClasses, appView);
+    LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems =
+        new LinkedHashMap<>(startupItems.size());
+    for (StartupItem startupItem : startupItems.values()) {
+      addStartupItem(startupItem, rewrittenStartupItems, appView);
     }
-    assert rewrittenStartupItems.stream().noneMatch(StartupItem::isSyntheticStartupMethod);
     return createNonEmpty(rewrittenStartupItems);
   }
 
   private static void addStartupItem(
       StartupItem startupItem,
-      LinkedHashSet<StartupItem> rewrittenStartupItems,
-      Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses,
+      LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems,
       AppView<?> appView) {
-    if (startupItem.isSyntheticStartupMethod()) {
-      SyntheticStartupMethod syntheticStartupMethod = startupItem.asSyntheticStartupMethod();
-      List<DexProgramClass> syntheticClassesForContext =
-          syntheticContextsToSyntheticClasses.getOrDefault(
-              syntheticStartupMethod.getSyntheticContextType(), Collections.emptyList());
-      for (DexProgramClass clazz : syntheticClassesForContext) {
-        addClassAndParentClasses(clazz, rewrittenStartupItems, appView);
-        addAllMethods(clazz, rewrittenStartupItems);
-      }
+    if (startupItem.isStartupClass()) {
+      addClassAndParentClasses(
+          startupItem.asStartupClass().getReference(), rewrittenStartupItems, appView);
     } else {
-      if (startupItem.isStartupClass()) {
-        addClassAndParentClasses(
-            startupItem.asStartupClass().getReference(), rewrittenStartupItems, appView);
-      } else {
-        rewrittenStartupItems.add(startupItem);
-      }
+      rewrittenStartupItems.put(startupItem.getReference(), startupItem);
     }
   }
 
   private static boolean addClass(
-      DexProgramClass clazz, LinkedHashSet<StartupItem> rewrittenStartupItems) {
-    return rewrittenStartupItems.add(
-        StartupClass.builder().setClassReference(clazz.getType()).build());
+      DexProgramClass clazz, LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems) {
+    StartupItem previous =
+        rewrittenStartupItems.put(
+            clazz.getType(), StartupClass.builder().setClassReference(clazz.getType()).build());
+    return previous == null;
   }
 
   private static void addClassAndParentClasses(
-      DexType type, LinkedHashSet<StartupItem> rewrittenStartupItems, AppView<?> appView) {
+      DexType type,
+      LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems,
+      AppView<?> appView) {
     DexProgramClass definition = appView.app().programDefinitionFor(type);
     if (definition != null) {
       addClassAndParentClasses(definition, rewrittenStartupItems, appView);
@@ -193,70 +132,45 @@
   }
 
   private static void addClassAndParentClasses(
-      DexProgramClass clazz, LinkedHashSet<StartupItem> rewrittenStartupItems, AppView<?> appView) {
+      DexProgramClass clazz,
+      LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems,
+      AppView<?> appView) {
     if (addClass(clazz, rewrittenStartupItems)) {
       addParentClasses(clazz, rewrittenStartupItems, appView);
     }
   }
 
   private static void addParentClasses(
-      DexProgramClass clazz, LinkedHashSet<StartupItem> rewrittenStartupItems, AppView<?> appView) {
+      DexProgramClass clazz,
+      LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems,
+      AppView<?> appView) {
     clazz.forEachImmediateSupertype(
         supertype -> addClassAndParentClasses(supertype, rewrittenStartupItems, appView));
   }
 
-  private static void addAllMethods(
-      DexProgramClass clazz, LinkedHashSet<StartupItem> rewrittenStartupItems) {
-    clazz.forEachProgramMethod(
-        method ->
-            rewrittenStartupItems.add(
-                StartupMethod.builder().setMethodReference(method.getReference()).build()));
-  }
-
   @Override
   public StartupOrder withoutPrunedItems(PrunedItems prunedItems, SyntheticItems syntheticItems) {
-    LinkedHashSet<StartupItem> rewrittenStartupItems = new LinkedHashSet<>(startupItems.size());
-    LazyBox<Set<DexType>> contextsOfLiveSynthetics =
-        new LazyBox<>(
-            () -> computeContextsOfLiveSynthetics(prunedItems.getPrunedApp(), syntheticItems));
-    for (StartupItem startupItem : startupItems) {
+    LinkedHashMap<DexReference, StartupItem> rewrittenStartupItems =
+        new LinkedHashMap<>(startupItems.size());
+    for (StartupItem startupItem : startupItems.values()) {
       // Only prune non-synthetic classes, since the pruning of a class does not imply that all
       // classes synthesized from it have been pruned.
       startupItem.accept(
           startupClass -> {
             if (!prunedItems.isRemoved(startupClass.getReference())) {
-              rewrittenStartupItems.add(startupItem);
+              rewrittenStartupItems.put(startupClass.getReference(), startupItem);
             }
           },
           startupMethod -> {
             if (!prunedItems.isRemoved(startupMethod.getReference())) {
-              rewrittenStartupItems.add(startupItem);
-            }
-          },
-          syntheticStartupMethod -> {
-            if (contextsOfLiveSynthetics
-                .computeIfAbsent()
-                .contains(syntheticStartupMethod.getSyntheticContextType())) {
-              rewrittenStartupItems.add(syntheticStartupMethod);
+              rewrittenStartupItems.put(startupMethod.getReference(), startupItem);
             }
           });
     }
     return createNonEmpty(rewrittenStartupItems);
   }
 
-  private Set<DexType> computeContextsOfLiveSynthetics(
-      DexApplication app, SyntheticItems syntheticItems) {
-    Set<DexType> contextsOfLiveSynthetics = Sets.newIdentityHashSet();
-    for (DexProgramClass clazz : app.classes()) {
-      if (syntheticItems.isSyntheticClass(clazz)) {
-        contextsOfLiveSynthetics.addAll(
-            syntheticItems.getSynthesizingContextTypes(clazz.getType()));
-      }
-    }
-    return contextsOfLiveSynthetics;
-  }
-
-  private StartupOrder createNonEmpty(LinkedHashSet<StartupItem> startupItems) {
+  private StartupOrder createNonEmpty(LinkedHashMap<DexReference, StartupItem> startupItems) {
     if (startupItems.isEmpty()) {
       assert false;
       return empty();
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java
index 6291d1e..456b3a2 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupCompleteness.java
@@ -9,17 +9,12 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.ThrowNullCode;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.Sets;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceMaps;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 public class StartupCompleteness {
@@ -28,16 +23,11 @@
   private final StartupOrder startupOrder;
 
   private StartupCompleteness(AppView<?> appView) {
-    SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization =
-        appView.enableWholeProgramOptimizations()
-            ? SyntheticToSyntheticContextGeneralization.createForR8()
-            : SyntheticToSyntheticContextGeneralization.createForD8();
     this.appView = appView;
     this.startupOrder =
         appView.hasClassHierarchy()
             ? appView.getStartupOrder()
-            : StartupOrder.createInitialStartupOrder(
-                appView.options(), null, syntheticToSyntheticContextGeneralization);
+            : StartupOrder.createInitialStartupOrder(appView.options(), null);
   }
 
   /**
@@ -82,22 +72,10 @@
 
   private Set<DexReference> computeStartupItems() {
     Set<DexReference> startupItems = Sets.newIdentityHashSet();
-    Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses =
-        appView.getSyntheticItems().computeSyntheticContextsToSyntheticClasses(appView);
     for (StartupItem startupItem : startupOrder.getItems()) {
       startupItem.accept(
           startupClass -> startupItems.add(startupClass.getReference()),
-          startupMethod -> startupItems.add(startupMethod.getReference()),
-          syntheticStartupMethod -> {
-            List<DexProgramClass> syntheticClasses =
-                syntheticContextsToSyntheticClasses.getOrDefault(
-                    syntheticStartupMethod.getSyntheticContextType(), Collections.emptyList());
-            for (DexProgramClass syntheticClass : syntheticClasses) {
-              startupItems.add(syntheticClass.getType());
-              syntheticClass.forEachProgramMethod(
-                  method -> startupItems.add(method.getReference()));
-            }
-          });
+          startupMethod -> startupItems.add(startupMethod.getReference()));
     }
     return startupItems;
   }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
index b369a94..e1e8408 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
@@ -10,49 +10,48 @@
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.PrunedItems;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.synthesis.SyntheticItems;
 import com.android.tools.r8.utils.InternalOptions;
 import java.util.Collection;
-import java.util.LinkedHashSet;
+import java.util.LinkedHashMap;
 
 public abstract class StartupOrder {
 
   StartupOrder() {}
 
   public static StartupOrder createInitialStartupOrder(
-      InternalOptions options,
-      DexDefinitionSupplier definitions,
-      SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization) {
-    StartupProfile startupProfile =
-        StartupProfile.parseStartupProfile(
-            options, definitions, syntheticToSyntheticContextGeneralization);
+      InternalOptions options, DexDefinitionSupplier definitions) {
+    StartupProfile startupProfile = StartupProfile.parseStartupProfile(options, definitions);
     if (startupProfile == null || startupProfile.getStartupItems().isEmpty()) {
       return empty();
     }
-    return new NonEmptyStartupOrder(new LinkedHashSet<>(startupProfile.getStartupItems()));
+    LinkedHashMap<DexReference, StartupItem> startupItems =
+        new LinkedHashMap<>(startupProfile.size());
+    for (StartupItem startupItem : startupProfile.getStartupItems()) {
+      startupItems.put(startupItem.getReference(), startupItem);
+    }
+    return new NonEmptyStartupOrder(new LinkedHashMap<>(startupItems));
   }
 
   public static StartupOrder createInitialStartupOrderForD8(AppView<?> appView) {
-    return createInitialStartupOrder(
-        appView.options(), appView, SyntheticToSyntheticContextGeneralization.createForD8());
+    return createInitialStartupOrder(appView.options(), appView);
   }
 
   public static StartupOrder createInitialStartupOrderForR8(DexApplication application) {
-    return createInitialStartupOrder(
-        application.options, application, SyntheticToSyntheticContextGeneralization.createForR8());
+    return createInitialStartupOrder(application.options, application);
   }
 
   public static StartupOrder empty() {
     return new EmptyStartupOrder();
   }
 
-  public abstract boolean contains(DexMethod method, SyntheticItems syntheticItems);
+  public abstract boolean contains(DexMethod method);
 
-  public abstract boolean contains(DexType type, SyntheticItems syntheticItems);
+  public abstract boolean contains(DexType type);
 
   public abstract Collection<StartupItem> getItems();
 
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java
index a4b0f5e..4c8ea1b 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupProfileProviderUtils.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.experimental.startup.profile.StartupProfile;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.profile.art.HumanReadableArtProfileParserBuilder;
 import com.android.tools.r8.startup.StartupProfileBuilder;
 import com.android.tools.r8.startup.StartupProfileProvider;
@@ -55,15 +54,8 @@
     // Do not report missing items.
     MissingStartupProfileItemsDiagnostic.Builder missingItemsDiagnosticBuilder =
         MissingStartupProfileItemsDiagnostic.Builder.nop();
-    // Do not generalize synthetic items to their synthetic context.
-    SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization =
-        SyntheticToSyntheticContextGeneralization.createForD8();
     StartupProfile.Builder startupProfileBuilder =
-        StartupProfile.builder(
-            options,
-            missingItemsDiagnosticBuilder,
-            startupProfileProvider,
-            syntheticToSyntheticContextGeneralization);
+        StartupProfile.builder(options, missingItemsDiagnosticBuilder, startupProfileProvider);
     // Do not report warnings for lines that cannot be parsed.
     startupProfileBuilder.setIgnoreWarnings();
     // Populate the startup profile builder.
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupClass.java b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupClass.java
index d281a65..9ab1224 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupClass.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupClass.java
@@ -29,21 +29,17 @@
   }
 
   @Override
-  public void accept(
-      Consumer<StartupClass> classConsumer,
-      Consumer<StartupMethod> methodConsumer,
-      Consumer<SyntheticStartupMethod> syntheticMethodConsumer) {
+  public void accept(Consumer<StartupClass> classConsumer, Consumer<StartupMethod> methodConsumer) {
     classConsumer.accept(this);
   }
 
   @Override
   public <T> T apply(
-      Function<StartupClass, T> classFunction,
-      Function<StartupMethod, T> methodFunction,
-      Function<SyntheticStartupMethod, T> syntheticMethodFunction) {
+      Function<StartupClass, T> classFunction, Function<StartupMethod, T> methodFunction) {
     return classFunction.apply(this);
   }
 
+  @Override
   public DexType getReference() {
     return type;
   }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupItem.java b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupItem.java
index b7e6f1c..91a615e 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupItem.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupItem.java
@@ -4,20 +4,19 @@
 
 package com.android.tools.r8.experimental.startup.profile;
 
+import com.android.tools.r8.graph.DexReference;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
 public abstract class StartupItem {
 
   public abstract void accept(
-      Consumer<StartupClass> classConsumer,
-      Consumer<StartupMethod> methodConsumer,
-      Consumer<SyntheticStartupMethod> syntheticMethodConsumer);
+      Consumer<StartupClass> classConsumer, Consumer<StartupMethod> methodConsumer);
 
   public abstract <T> T apply(
-      Function<StartupClass, T> classFunction,
-      Function<StartupMethod, T> methodFunction,
-      Function<SyntheticStartupMethod, T> syntheticMethodFunction);
+      Function<StartupClass, T> classFunction, Function<StartupMethod, T> methodFunction);
+
+  public abstract DexReference getReference();
 
   public boolean isStartupClass() {
     return false;
@@ -37,14 +36,5 @@
     return null;
   }
 
-  public boolean isSyntheticStartupMethod() {
-    return false;
-  }
-
-  public SyntheticStartupMethod asSyntheticStartupMethod() {
-    assert false;
-    return null;
-  }
-
   public abstract String serializeToString();
 }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupMethod.java b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupMethod.java
index 18045ef..e245260 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupMethod.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupMethod.java
@@ -29,21 +29,17 @@
   }
 
   @Override
-  public void accept(
-      Consumer<StartupClass> classConsumer,
-      Consumer<StartupMethod> methodConsumer,
-      Consumer<SyntheticStartupMethod> syntheticMethodConsumer) {
+  public void accept(Consumer<StartupClass> classConsumer, Consumer<StartupMethod> methodConsumer) {
     methodConsumer.accept(this);
   }
 
   @Override
   public <T> T apply(
-      Function<StartupClass, T> classFunction,
-      Function<StartupMethod, T> methodFunction,
-      Function<SyntheticStartupMethod, T> syntheticMethodFunction) {
+      Function<StartupClass, T> classFunction, Function<StartupMethod, T> methodFunction) {
     return methodFunction.apply(this);
   }
 
+  @Override
   public DexMethod getReference() {
     return method;
   }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfile.java b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfile.java
index 3a63098..f2f66a2 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfile.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/profile/StartupProfile.java
@@ -8,14 +8,12 @@
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.profile.art.ArtProfileBuilderUtils;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.profile.art.HumanReadableArtProfileParser;
 import com.android.tools.r8.profile.art.HumanReadableArtProfileParserBuilder;
 import com.android.tools.r8.startup.StartupClassBuilder;
 import com.android.tools.r8.startup.StartupMethodBuilder;
 import com.android.tools.r8.startup.StartupProfileBuilder;
 import com.android.tools.r8.startup.StartupProfileProvider;
-import com.android.tools.r8.startup.SyntheticStartupMethodBuilder;
 import com.android.tools.r8.startup.diagnostic.MissingStartupProfileItemsDiagnostic;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Reporter;
@@ -36,13 +34,8 @@
   public static Builder builder(
       InternalOptions options,
       MissingStartupProfileItemsDiagnostic.Builder missingItemsDiagnosticBuilder,
-      StartupProfileProvider startupProfileProvider,
-      SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization) {
-    return new Builder(
-        options,
-        missingItemsDiagnosticBuilder,
-        startupProfileProvider,
-        syntheticToSyntheticContextGeneralization);
+      StartupProfileProvider startupProfileProvider) {
+    return new Builder(options, missingItemsDiagnosticBuilder, startupProfileProvider);
   }
 
   public static StartupProfile merge(Collection<StartupProfile> startupProfiles) {
@@ -69,9 +62,7 @@
    * </pre>
    */
   public static StartupProfile parseStartupProfile(
-      InternalOptions options,
-      DexDefinitionSupplier definitions,
-      SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization) {
+      InternalOptions options, DexDefinitionSupplier definitions) {
     if (!options.getStartupOptions().hasStartupProfileProviders()) {
       return null;
     }
@@ -83,11 +74,7 @@
           new MissingStartupProfileItemsDiagnostic.Builder(definitions)
               .setOrigin(startupProfileProvider.getOrigin());
       StartupProfile.Builder startupProfileBuilder =
-          StartupProfile.builder(
-              options,
-              missingItemsDiagnosticBuilder,
-              startupProfileProvider,
-              syntheticToSyntheticContextGeneralization);
+          StartupProfile.builder(options, missingItemsDiagnosticBuilder, startupProfileProvider);
       startupProfileProvider.getStartupProfile(startupProfileBuilder);
       startupProfiles.add(startupProfileBuilder.build());
       if (missingItemsDiagnosticBuilder.hasMissingStartupItems()) {
@@ -101,27 +88,27 @@
     return startupItems;
   }
 
+  public int size() {
+    return startupItems.size();
+  }
+
   public static class Builder implements StartupProfileBuilder {
 
     private final DexItemFactory dexItemFactory;
     private final MissingStartupProfileItemsDiagnostic.Builder missingItemsDiagnosticBuilder;
     private Reporter reporter;
     private final StartupProfileProvider startupProfileProvider;
-    private final SyntheticToSyntheticContextGeneralization
-        syntheticToSyntheticContextGeneralization;
 
     private final LinkedHashSet<StartupItem> startupItems = new LinkedHashSet<>();
 
     Builder(
         InternalOptions options,
         MissingStartupProfileItemsDiagnostic.Builder missingItemsDiagnosticBuilder,
-        StartupProfileProvider startupProfileProvider,
-        SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization) {
+        StartupProfileProvider startupProfileProvider) {
       this.dexItemFactory = options.dexItemFactory();
       this.missingItemsDiagnosticBuilder = missingItemsDiagnosticBuilder;
       this.reporter = options.reporter;
       this.startupProfileProvider = startupProfileProvider;
-      this.syntheticToSyntheticContextGeneralization = syntheticToSyntheticContextGeneralization;
     }
 
     @Override
@@ -147,19 +134,6 @@
     }
 
     @Override
-    public StartupProfileBuilder addSyntheticStartupMethod(
-        Consumer<SyntheticStartupMethodBuilder> syntheticStartupMethodBuilderConsumer) {
-      SyntheticStartupMethod.Builder syntheticStartupMethodBuilder =
-          SyntheticStartupMethod.builder(dexItemFactory);
-      syntheticStartupMethodBuilderConsumer.accept(syntheticStartupMethodBuilder);
-      SyntheticStartupMethod syntheticStartupMethod = syntheticStartupMethodBuilder.build();
-      if (missingItemsDiagnosticBuilder.registerSyntheticStartupMethod(syntheticStartupMethod)) {
-        return this;
-      }
-      return addStartupItem(syntheticStartupMethod);
-    }
-
-    @Override
     public StartupProfileBuilder addHumanReadableArtProfile(
         TextInputStream textInputStream,
         Consumer<HumanReadableArtProfileParserBuilder> parserBuilderConsumer) {
@@ -168,7 +142,7 @@
               .setReporter(reporter)
               .setProfileBuilder(
                   ArtProfileBuilderUtils.createBuilderForArtProfileToStartupProfileConversion(
-                      this, syntheticToSyntheticContextGeneralization));
+                      this));
       parserBuilderConsumer.accept(parserBuilder);
       HumanReadableArtProfileParser parser = parserBuilder.build();
       parser.parse(textInputStream, startupProfileProvider.getOrigin());
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/profile/SyntheticStartupMethod.java b/src/main/java/com/android/tools/r8/experimental/startup/profile/SyntheticStartupMethod.java
deleted file mode 100644
index c68a198..0000000
--- a/src/main/java/com/android/tools/r8/experimental/startup/profile/SyntheticStartupMethod.java
+++ /dev/null
@@ -1,113 +0,0 @@
-// 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.experimental.startup.profile;
-
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.startup.SyntheticStartupMethodBuilder;
-import com.android.tools.r8.utils.ClassReferenceUtils;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-public class SyntheticStartupMethod extends StartupItem {
-
-  private final DexType syntheticContextType;
-
-  SyntheticStartupMethod(DexType syntheticContextType) {
-    this.syntheticContextType = syntheticContextType;
-  }
-
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  public static Builder builder(DexItemFactory dexItemFactory) {
-    return new Builder(dexItemFactory);
-  }
-
-  @Override
-  public void accept(
-      Consumer<StartupClass> classConsumer,
-      Consumer<StartupMethod> methodConsumer,
-      Consumer<SyntheticStartupMethod> syntheticMethodConsumer) {
-    syntheticMethodConsumer.accept(this);
-  }
-
-  @Override
-  public <T> T apply(
-      Function<StartupClass, T> classFunction,
-      Function<StartupMethod, T> methodFunction,
-      Function<SyntheticStartupMethod, T> syntheticMethodFunction) {
-    return syntheticMethodFunction.apply(this);
-  }
-
-  public DexType getSyntheticContextType() {
-    return syntheticContextType;
-  }
-
-  @Override
-  public boolean isSyntheticStartupMethod() {
-    return true;
-  }
-
-  @Override
-  public SyntheticStartupMethod asSyntheticStartupMethod() {
-    return this;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    SyntheticStartupMethod that = (SyntheticStartupMethod) o;
-    return syntheticContextType == that.syntheticContextType;
-  }
-
-  @Override
-  public int hashCode() {
-    return syntheticContextType.hashCode();
-  }
-
-  @Override
-  public String serializeToString() {
-    return 'S' + syntheticContextType.toDescriptorString();
-  }
-
-  public static class Builder implements SyntheticStartupMethodBuilder {
-
-    private final DexItemFactory dexItemFactory;
-
-    private DexType syntheticContextReference;
-
-    Builder() {
-      this(null);
-    }
-
-    Builder(DexItemFactory dexItemFactory) {
-      this.dexItemFactory = dexItemFactory;
-    }
-
-    @Override
-    public Builder setSyntheticContextReference(ClassReference syntheticContextReference) {
-      assert dexItemFactory != null;
-      return setSyntheticContextReference(
-          ClassReferenceUtils.toDexType(syntheticContextReference, dexItemFactory));
-    }
-
-    public Builder setSyntheticContextReference(DexType syntheticContextReference) {
-      this.syntheticContextReference = syntheticContextReference;
-      return this;
-    }
-
-    public SyntheticStartupMethod build() {
-      return new SyntheticStartupMethod(syntheticContextReference);
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
index 84c8a96..cb6c4ac 100644
--- a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
+++ b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
@@ -175,7 +175,7 @@
       feature = classToFeatureSplitMap.getOrDefault(type, FeatureSplit.BASE);
     }
     if (feature.isBase()) {
-      return !startupOrder.contains(type, syntheticItems)
+      return !startupOrder.contains(type)
               || options.getStartupOptions().isStartupBoundaryOptimizationsEnabled()
           ? FeatureSplit.BASE
           : FeatureSplit.BASE_STARTUP;
diff --git a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
index 68cf4a9..d88be72 100644
--- a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
+++ b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
@@ -67,33 +67,31 @@
 
     // Next perform startup checks.
     StartupOrder startupOrder = appView.getStartupOrder();
-    SyntheticItems syntheticItems = appView.getSyntheticItems();
-    OptionalBool callerIsStartupMethod = isStartupMethod(caller, startupOrder, syntheticItems);
+    OptionalBool callerIsStartupMethod = isStartupMethod(caller, startupOrder);
     if (callerIsStartupMethod.isTrue()) {
       // If the caller is a startup method, then only allow inlining if the callee is also a startup
       // method.
-      if (isStartupMethod(callee, startupOrder, syntheticItems).isFalse()) {
+      if (isStartupMethod(callee, startupOrder).isFalse()) {
         return false;
       }
     } else if (callerIsStartupMethod.isFalse()) {
       // If the caller is not a startup method, then only allow inlining if the caller is not a
       // startup class or the callee is a startup class.
-      if (startupOrder.contains(caller.getHolderType(), syntheticItems)
-          && !startupOrder.contains(callee.getHolderType(), syntheticItems)) {
+      if (startupOrder.contains(caller.getHolderType())
+          && !startupOrder.contains(callee.getHolderType())) {
         return false;
       }
     }
     return true;
   }
 
-  private static OptionalBool isStartupMethod(
-      ProgramMethod method, StartupOrder startupOrder, SyntheticItems syntheticItems) {
+  private static OptionalBool isStartupMethod(ProgramMethod method, StartupOrder startupOrder) {
     if (method.getDefinition().isD8R8Synthesized()) {
       // Due to inadequate rewriting of the startup list during desugaring, we do not give an
       // accurate result in this case.
       return OptionalBool.unknown();
     }
-    return OptionalBool.of(startupOrder.contains(method.getReference(), syntheticItems));
+    return OptionalBool.of(startupOrder.contains(method.getReference()));
   }
 
   public static boolean isSafeForVerticalClassMerging(
@@ -116,9 +114,8 @@
     // If the source class is a startup class then require that the target class is also a startup
     // class.
     StartupOrder startupOrder = appView.getStartupOrder();
-    SyntheticItems syntheticItems = appView.getSyntheticItems();
-    if (startupOrder.contains(sourceClass.getType(), syntheticItems)
-        && !startupOrder.contains(targetClass.getType(), syntheticItems)) {
+    if (startupOrder.contains(sourceClass.getType())
+        && !startupOrder.contains(targetClass.getType())) {
       return false;
     }
     return true;
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilderUtils.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilderUtils.java
index 77d0005..bbfe13e 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilderUtils.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilderUtils.java
@@ -4,14 +4,11 @@
 
 package com.android.tools.r8.profile.art;
 
-import static com.android.tools.r8.synthesis.SyntheticNaming.COMPANION_CLASS_SUFFIX;
-import static com.android.tools.r8.synthesis.SyntheticNaming.EXTERNAL_SYNTHETIC_CLASS_SEPARATOR;
 
 import com.android.tools.r8.TextInputStream;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
-import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.StartupProfileBuilder;
 import com.android.tools.r8.utils.MethodReferenceUtils;
 import java.io.IOException;
@@ -20,60 +17,12 @@
 
 public class ArtProfileBuilderUtils {
 
-  public interface SyntheticToSyntheticContextGeneralization {
-
-    ClassReference getSyntheticContextReference(ClassReference classReference);
-
-    /**
-     * When a startup profile is given to D8, the program input should be dex and the startup
-     * profile should have been generated by launching the dex that is given on input. Therefore,
-     * synthetic items in the ART profile should be present in the program input to D8 with the
-     * exact same synthetic names as in the ART profile. This means that there is no need to
-     * generalize synthetic items to their synthetic context.
-     */
-    static SyntheticToSyntheticContextGeneralization createForD8() {
-      return classReference -> null;
-    }
-
-    /**
-     * When a startup profile is given to R8, the program input is class files and the startup
-     * profile should have been generated by dexing the program input (in release and intermediate
-     * mode) and then launching the resulting app. The synthetic items in the resulting ART profile
-     * do not exist in the program input to R8 (and the same synthetics may receive different names
-     * in the R8 compilation). Therefore, synthetic items in the ART profile are generalized into
-     * matching all synthetics from their synthetic context.
-     */
-    static SyntheticToSyntheticContextGeneralization createForR8() {
-      return classReference -> {
-        // TODO(b/243777722): Move this logic into synthetic items and extend the mapping from
-        //  synthetic classes to their synthetic context to all synthetic kinds.
-        String classDescriptor = classReference.getDescriptor();
-        for (int i = 1; i < classDescriptor.length() - 1; i++) {
-          if (classDescriptor.charAt(i) != '$') {
-            continue;
-          }
-          if (classDescriptor.regionMatches(
-                  i, COMPANION_CLASS_SUFFIX, 0, COMPANION_CLASS_SUFFIX.length())
-              || classDescriptor.regionMatches(
-                  i,
-                  EXTERNAL_SYNTHETIC_CLASS_SEPARATOR,
-                  0,
-                  EXTERNAL_SYNTHETIC_CLASS_SEPARATOR.length())) {
-            return Reference.classFromDescriptor(classDescriptor.substring(0, i) + ";");
-          }
-        }
-        return null;
-      };
-    }
-  }
-
   /**
    * Helper for creating an {@link ArtProfileBuilder} that performs callbacks on the given {@param
    * startupProfileBuilder}.
    */
   public static ArtProfileBuilder createBuilderForArtProfileToStartupProfileConversion(
-      StartupProfileBuilder startupProfileBuilder,
-      SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization) {
+      StartupProfileBuilder startupProfileBuilder) {
     return new ArtProfileBuilder() {
 
       @Override
@@ -81,19 +30,9 @@
           Consumer<ArtProfileClassRuleBuilder> classRuleBuilderConsumer) {
         MutableArtProfileClassRule classRule = new MutableArtProfileClassRule();
         classRuleBuilderConsumer.accept(classRule);
-        ClassReference syntheticContextReference =
-            syntheticToSyntheticContextGeneralization.getSyntheticContextReference(
-                classRule.getClassReference());
-        if (syntheticContextReference == null) {
-          startupProfileBuilder.addStartupClass(
-              startupClassBuilder ->
-                  startupClassBuilder.setClassReference(classRule.getClassReference()));
-        } else {
-          startupProfileBuilder.addSyntheticStartupMethod(
-              syntheticStartupMethodBuilder ->
-                  syntheticStartupMethodBuilder.setSyntheticContextReference(
-                      syntheticContextReference));
-        }
+        startupProfileBuilder.addStartupClass(
+            startupClassBuilder ->
+                startupClassBuilder.setClassReference(classRule.getClassReference()));
         return this;
       }
 
@@ -102,19 +41,9 @@
           Consumer<ArtProfileMethodRuleBuilder> methodRuleBuilderConsumer) {
         MutableArtProfileMethodRule methodRule = new MutableArtProfileMethodRule();
         methodRuleBuilderConsumer.accept(methodRule);
-        ClassReference syntheticContextReference =
-            syntheticToSyntheticContextGeneralization.getSyntheticContextReference(
-                methodRule.getMethodReference().getHolderClass());
-        if (syntheticContextReference == null) {
-          startupProfileBuilder.addStartupMethod(
-              startupMethodBuilder ->
-                  startupMethodBuilder.setMethodReference(methodRule.getMethodReference()));
-        } else {
-          startupProfileBuilder.addSyntheticStartupMethod(
-              syntheticStartupMethodBuilder ->
-                  syntheticStartupMethodBuilder.setSyntheticContextReference(
-                      syntheticContextReference));
-        }
+        startupProfileBuilder.addStartupMethod(
+            startupMethodBuilder ->
+                startupMethodBuilder.setMethodReference(methodRule.getMethodReference()));
         return this;
       }
 
diff --git a/src/main/java/com/android/tools/r8/startup/StartupProfileBuilder.java b/src/main/java/com/android/tools/r8/startup/StartupProfileBuilder.java
index 47916c1..3ee53c7 100644
--- a/src/main/java/com/android/tools/r8/startup/StartupProfileBuilder.java
+++ b/src/main/java/com/android/tools/r8/startup/StartupProfileBuilder.java
@@ -21,29 +21,6 @@
       Consumer<StartupMethodBuilder> startupMethodBuilderConsumer);
 
   /**
-   * API for adding information about a synthetic startup method to the compiler.
-   *
-   * <p>When shrinking an app using R8, the names of synthetic classes may differ from the synthetic
-   * names that arise from dexing the app using D8. Therefore, synthetic classes and methods should
-   * not be added to the startup profile using {@link #addStartupClass(Consumer)} and {@link
-   * #addStartupMethod(Consumer)}.
-   *
-   * <p>Instead, synthetic items should be added to the startup profile using this method, which
-   * takes the name of the synthetic context instead of the synthetic name. The addition of the
-   * synthetic context will be interpreted as the presence of any method on any synthetic class that
-   * has been synthesized from the synthetic context.
-   *
-   * <p>Example: Instead of adding "Lcom/example/MainActivity$ExternalSynthetic0;->m()V" as a
-   * (non-synthetic) startup method, a synthetic startup method should be added with synthetic
-   * context "Lcom/example/MainActivity;".
-   *
-   * <p>NOTE: This should only be used when supplying a startup profile that is generated from an
-   * unobfuscated build of the app to R8.
-   */
-  StartupProfileBuilder addSyntheticStartupMethod(
-      Consumer<SyntheticStartupMethodBuilder> syntheticStartupMethodBuilderConsumer);
-
-  /**
    * Adds the rules from the given human-readable ART profile to the startup profile and then closes
    * the stream.
    *
diff --git a/src/main/java/com/android/tools/r8/startup/SyntheticStartupMethodBuilder.java b/src/main/java/com/android/tools/r8/startup/SyntheticStartupMethodBuilder.java
deleted file mode 100644
index 281bac7..0000000
--- a/src/main/java/com/android/tools/r8/startup/SyntheticStartupMethodBuilder.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.startup;
-
-import com.android.tools.r8.Keep;
-import com.android.tools.r8.references.ClassReference;
-
-/** Interface for providing information about a synthetic startup method to the compiler. */
-@Keep
-public interface SyntheticStartupMethodBuilder {
-
-  SyntheticStartupMethodBuilder setSyntheticContextReference(ClassReference classReference);
-}
diff --git a/src/main/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnostic.java b/src/main/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnostic.java
index 6fa28ea..272684d 100644
--- a/src/main/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnostic.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.Keep;
 import com.android.tools.r8.experimental.startup.profile.StartupClass;
 import com.android.tools.r8.experimental.startup.profile.StartupMethod;
-import com.android.tools.r8.experimental.startup.profile.SyntheticStartupMethod;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexString;
@@ -102,15 +101,6 @@
       return false;
     }
 
-    public boolean registerSyntheticStartupMethod(SyntheticStartupMethod syntheticStartupMethod) {
-      if (definitions != null
-          && !definitions.hasDefinitionFor(syntheticStartupMethod.getSyntheticContextType())) {
-        addMissingStartupItem(syntheticStartupMethod.getSyntheticContextType());
-        return true;
-      }
-      return false;
-    }
-
     private void addMissingStartupItem(DexReference reference) {
       DexString jDollarDescriptorPrefix = definitions.dexItemFactory().jDollarDescriptorPrefix;
       if (!reference.getContextType().getDescriptor().startsWith(jDollarDescriptorPrefix)) {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 4b0c8ea..4ec6686 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -539,22 +539,6 @@
     return oracle.getSynthesizingContexts(clazz);
   }
 
-  public Map<DexType, List<DexProgramClass>> computeSyntheticContextsToSyntheticClasses(
-      AppView<?> appView) {
-    Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses =
-        new IdentityHashMap<>();
-    for (DexProgramClass clazz : appView.appInfo().classes()) {
-      if (isSyntheticClass(clazz)) {
-        for (DexType synthesizingContextType : getSynthesizingContextTypes(clazz.getType())) {
-          syntheticContextsToSyntheticClasses
-              .computeIfAbsent(synthesizingContextType, ignoreKey -> new ArrayList<>())
-              .add(clazz);
-        }
-      }
-    }
-    return syntheticContextsToSyntheticClasses;
-  }
-
   public Collection<Origin> getSynthesizingOrigin(DexType type) {
     if (!isSynthetic(type)) {
       return Collections.emptyList();
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpUtils.java b/src/main/java/com/android/tools/r8/utils/CompileDumpUtils.java
index f0275f5..4356671 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpUtils.java
@@ -43,26 +43,16 @@
           try (BufferedReader bufferedReader = Files.newBufferedReader(path)) {
             while (bufferedReader.ready()) {
               String rule = bufferedReader.readLine();
-              if (rule.charAt(0) == 'S') {
-                String classDescriptor = rule.substring(1);
-                assert DescriptorUtils.isClassDescriptor(classDescriptor);
-                startupProfileBuilder.addSyntheticStartupMethod(
-                    syntheticStartupMethodBuilder ->
-                        syntheticStartupMethodBuilder.setSyntheticContextReference(
-                            Reference.classFromDescriptor(classDescriptor)));
+              MethodReference methodReference = MethodReferenceUtils.parseSmaliString(rule);
+              if (methodReference != null) {
+                startupProfileBuilder.addStartupMethod(
+                    startupMethodBuilder ->
+                        startupMethodBuilder.setMethodReference(methodReference));
               } else {
-                MethodReference methodReference = MethodReferenceUtils.parseSmaliString(rule);
-                if (methodReference != null) {
-                  startupProfileBuilder.addStartupMethod(
-                      startupMethodBuilder ->
-                          startupMethodBuilder.setMethodReference(methodReference));
-                } else {
-                  assert DescriptorUtils.isClassDescriptor(rule);
-                  startupProfileBuilder.addStartupClass(
-                      startupClassBuilder ->
-                          startupClassBuilder.setClassReference(
-                              Reference.classFromDescriptor(rule)));
-                }
+                assert DescriptorUtils.isClassDescriptor(rule);
+                startupProfileBuilder.addStartupClass(
+                    startupClassBuilder ->
+                        startupClassBuilder.setClassReference(Reference.classFromDescriptor(rule)));
               }
             }
           }
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index 487451f..2eda6e7 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -26,7 +26,6 @@
 import com.android.tools.r8.experimental.startup.profile.StartupProfile;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.StartupProfileProvider;
 import com.android.tools.r8.startup.diagnostic.MissingStartupProfileItemsDiagnostic;
@@ -807,14 +806,9 @@
     MissingStartupProfileItemsDiagnostic.Builder missingStartupProfileItemsDiagnosticBuilder =
         MissingStartupProfileItemsDiagnostic.Builder.nop();
     StartupProfileProvider startupProfileProvider = startupProfileProviders.get(0);
-    SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization =
-        SyntheticToSyntheticContextGeneralization.createForD8();
     StartupProfile.Builder startupProfileBuilder =
         StartupProfile.builder(
-            options,
-            missingStartupProfileItemsDiagnosticBuilder,
-            startupProfileProvider,
-            syntheticToSyntheticContextGeneralization);
+            options, missingStartupProfileItemsDiagnosticBuilder, startupProfileProvider);
     startupProfileProvider.getStartupProfile(startupProfileBuilder);
 
     // Verify we found the same rule.
diff --git a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
index fa1dd30..53c02be 100644
--- a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
+++ b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
 import com.android.tools.r8.startup.utils.StartupTestingUtils;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -55,9 +54,7 @@
         .compile()
         .addRunClasspathFiles(StartupTestingUtils.getAndroidUtilLog(temp))
         .run(parameters.getRuntime(), Main.class)
-        .apply(
-            StartupTestingUtils.removeStartupListFromStdout(
-                startupList::add, SyntheticToSyntheticContextGeneralization.createForR8()))
+        .apply(StartupTestingUtils.removeStartupListFromStdout(startupList::add))
         .assertSuccessWithOutputLines(getExpectedOutput());
 
     testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/startup/StartupInstrumentationTest.java b/src/test/java/com/android/tools/r8/startup/StartupInstrumentationTest.java
index 8399d05..d53257c 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupInstrumentationTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupInstrumentationTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.profile.ExternalStartupClass;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
@@ -50,8 +49,6 @@
   public void test() throws Exception {
     Path out = temp.newFolder().toPath().resolve("out.txt").toAbsolutePath();
     Set<ExternalStartupItem> startupList = new LinkedHashSet<>();
-    SyntheticToSyntheticContextGeneralization syntheticGeneralization =
-        SyntheticToSyntheticContextGeneralization.createForD8();
     testForD8(parameters.getBackend())
         .addInnerClasses(getClass())
         .applyIf(
@@ -68,11 +65,8 @@
         .run(parameters.getRuntime(), Main.class, Boolean.toString(logcat), out.toString())
         .applyIf(
             logcat,
-            StartupTestingUtils.removeStartupListFromStdout(
-                startupList::add, syntheticGeneralization),
-            runResult ->
-                StartupTestingUtils.readStartupListFromFile(
-                    out, startupList::add, syntheticGeneralization))
+            StartupTestingUtils.removeStartupListFromStdout(startupList::add),
+            runResult -> StartupTestingUtils.readStartupListFromFile(out, startupList::add))
         .assertSuccessWithOutputLines(getExpectedOutput());
     assertEquals(getExpectedStartupList(), startupList);
   }
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
index 742361e..703c916 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
@@ -18,13 +18,11 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.ir.desugar.LambdaClass;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.profile.ExternalStartupClass;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
 import com.android.tools.r8.startup.profile.ExternalStartupMethod;
-import com.android.tools.r8.startup.profile.ExternalSyntheticStartupMethod;
 import com.android.tools.r8.startup.utils.MixedSectionLayoutInspector;
 import com.android.tools.r8.startup.utils.StartupTestingUtils;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
@@ -42,6 +40,7 @@
 import java.util.List;
 import java.util.Set;
 import java.util.function.Consumer;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -103,9 +102,7 @@
         .compile()
         .addRunClasspathFiles(StartupTestingUtils.getAndroidUtilLog(temp))
         .run(parameters.getRuntime(), Main.class, Boolean.toString(useLambda))
-        .apply(
-            StartupTestingUtils.removeStartupListFromStdout(
-                startupList::add, SyntheticToSyntheticContextGeneralization.createForD8()))
+        .apply(StartupTestingUtils.removeStartupListFromStdout(startupList::add))
         .assertSuccessWithOutputLines(getExpectedOutput())
         .apply(
             runResult ->
@@ -127,6 +124,8 @@
         .assertSuccessWithOutputLines(getExpectedOutput());
   }
 
+  // TODO(b/271822426): Reenable test.
+  @Ignore("b/271822426")
   @Test
   public void testLayoutUsingR8() throws Exception {
     // First generate a startup list for the original app.
@@ -144,9 +143,7 @@
     instrumentationCompileResult
         .addRunClasspathFiles(StartupTestingUtils.getAndroidUtilLog(temp))
         .run(parameters.getRuntime(), Main.class, Boolean.toString(useLambda))
-        .apply(
-            StartupTestingUtils.removeStartupListFromStdout(
-                startupList::add, SyntheticToSyntheticContextGeneralization.createForR8()))
+        .apply(StartupTestingUtils.removeStartupListFromStdout(startupList::add))
         .assertSuccessWithOutputLines(getExpectedOutput())
         .apply(
             runResult ->
@@ -216,10 +213,11 @@
             .build());
     if (useLambda) {
       if (isStartupListForOriginalApp) {
-        builder.add(
-            ExternalSyntheticStartupMethod.builder()
-                .setSyntheticContextReference(Reference.classFromClass(B.class))
-                .build());
+        // TODO(b/271822426): Update after rewriting startup profile.
+        /*builder.add(
+        ExternalSyntheticStartupMethod.builder()
+            .setSyntheticContextReference(Reference.classFromClass(B.class))
+            .build());*/
       } else {
         ClassSubject bClassSubject = inspector.clazz(B.class);
 
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
index 815b50d..9bde49b 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
@@ -15,13 +15,11 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.profile.ExternalStartupClass;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
 import com.android.tools.r8.startup.profile.ExternalStartupMethod;
-import com.android.tools.r8.startup.profile.ExternalSyntheticStartupMethod;
 import com.android.tools.r8.startup.utils.MixedSectionLayoutInspector;
 import com.android.tools.r8.startup.utils.StartupTestingUtils;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
@@ -35,6 +33,7 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -62,6 +61,8 @@
         BooleanUtils.values());
   }
 
+  // TODO(b/271822426): Reenable test.
+  @Ignore("b/271822426")
   @Test
   public void test() throws Exception {
     LinkedHashSet<ExternalStartupItem> startupList = new LinkedHashSet<>();
@@ -74,9 +75,7 @@
         .compile()
         .addRunClasspathFiles(StartupTestingUtils.getAndroidUtilLog(temp))
         .run(parameters.getRuntime(), Main.class)
-        .apply(
-            StartupTestingUtils.removeStartupListFromStdout(
-                startupList::add, SyntheticToSyntheticContextGeneralization.createForR8()))
+        .apply(StartupTestingUtils.removeStartupListFromStdout(startupList::add))
         .assertSuccessWithOutputLines(getExpectedOutput());
     assertEquals(getExpectedStartupList(), startupList);
 
@@ -122,9 +121,10 @@
         ExternalStartupMethod.builder()
             .setMethodReference(Reference.methodFromMethod(B.class.getDeclaredMethod("b")))
             .build(),
-        ExternalSyntheticStartupMethod.builder()
-            .setSyntheticContextReference(Reference.classFromClass(B.class))
-            .build(),
+        // TODO(b/271822426): Update after rewriting startup profile.
+        /*ExternalSyntheticStartupMethod.builder()
+        .setSyntheticContextReference(Reference.classFromClass(B.class))
+        .build(),*/
         ExternalStartupMethod.builder()
             .setMethodReference(Reference.methodFromMethod(B.class.getDeclaredMethod("lambda$b$0")))
             .build(),
diff --git a/src/test/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnosticTest.java b/src/test/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnosticTest.java
index d9ed155..c7c5eef 100644
--- a/src/test/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnosticTest.java
+++ b/src/test/java/com/android/tools/r8/startup/diagnostic/MissingStartupProfileItemsDiagnosticTest.java
@@ -23,6 +23,7 @@
 import com.android.tools.r8.utils.StringUtils;
 import java.util.Collection;
 import java.util.Collections;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -40,6 +41,8 @@
     return getTestParameters().withNoneRuntime().build();
   }
 
+  // TODO(b/271822426): Reenable test.
+  @Ignore("b/271822426")
   @Test
   public void testD8() throws Exception {
     testForD8(Backend.DEX)
@@ -50,6 +53,8 @@
         .compileWithExpectedDiagnostics(this::inspectDiagnostics);
   }
 
+  // TODO(b/271822426): Reenable test.
+  @Ignore("b/271822426")
   @Test
   public void testR8() throws Exception {
     testForR8(Backend.DEX)
@@ -77,10 +82,11 @@
                     startupMethodBuilder ->
                         startupMethodBuilder.setMethodReference(
                             MethodReferenceUtils.mainMethod(barClassReference)))
-                .addSyntheticStartupMethod(
-                    syntheticStartupMethodBuilder ->
-                        syntheticStartupMethodBuilder.setSyntheticContextReference(
-                            bazClassReference))
+                // TODO(b/271822426): Update after rewriting startup profile.
+                /*.addSyntheticStartupMethod(
+                syntheticStartupMethodBuilder ->
+                    syntheticStartupMethodBuilder.setSyntheticContextReference(
+                        bazClassReference))*/
                 .addStartupClass(
                     startupClassBuilder ->
                         startupClassBuilder.setClassReference(jDollarClassReference));
diff --git a/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupClass.java b/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupClass.java
index 4eee018..1bcbb45 100644
--- a/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupClass.java
+++ b/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupClass.java
@@ -23,8 +23,7 @@
   @Override
   public <T> T apply(
       Function<ExternalStartupClass, T> classFunction,
-      Function<ExternalStartupMethod, T> methodFunction,
-      Function<ExternalSyntheticStartupMethod, T> syntheticMethodFunction) {
+      Function<ExternalStartupMethod, T> methodFunction) {
     return classFunction.apply(this);
   }
 
diff --git a/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupItem.java b/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupItem.java
index e3aa745..6009d74 100644
--- a/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupItem.java
+++ b/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupItem.java
@@ -10,6 +10,5 @@
 
   public abstract <T> T apply(
       Function<ExternalStartupClass, T> classFunction,
-      Function<ExternalStartupMethod, T> methodFunction,
-      Function<ExternalSyntheticStartupMethod, T> syntheticMethodFunction);
+      Function<ExternalStartupMethod, T> methodFunction);
 }
diff --git a/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupMethod.java b/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupMethod.java
index 109a028..55775ea 100644
--- a/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupMethod.java
+++ b/src/test/java/com/android/tools/r8/startup/profile/ExternalStartupMethod.java
@@ -24,8 +24,7 @@
   @Override
   public <T> T apply(
       Function<ExternalStartupClass, T> classFunction,
-      Function<ExternalStartupMethod, T> methodFunction,
-      Function<ExternalSyntheticStartupMethod, T> syntheticMethodFunction) {
+      Function<ExternalStartupMethod, T> methodFunction) {
     return methodFunction.apply(this);
   }
 
diff --git a/src/test/java/com/android/tools/r8/startup/profile/ExternalSyntheticStartupMethod.java b/src/test/java/com/android/tools/r8/startup/profile/ExternalSyntheticStartupMethod.java
deleted file mode 100644
index 6d07638..0000000
--- a/src/test/java/com/android/tools/r8/startup/profile/ExternalSyntheticStartupMethod.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// 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.startup.profile;
-
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.startup.SyntheticStartupMethodBuilder;
-import java.util.function.Function;
-
-public class ExternalSyntheticStartupMethod extends ExternalStartupItem {
-
-  private final ClassReference syntheticContextReference;
-
-  ExternalSyntheticStartupMethod(ClassReference syntheticContextReference) {
-    this.syntheticContextReference = syntheticContextReference;
-  }
-
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  @Override
-  public <T> T apply(
-      Function<ExternalStartupClass, T> classFunction,
-      Function<ExternalStartupMethod, T> methodFunction,
-      Function<ExternalSyntheticStartupMethod, T> syntheticMethodFunction) {
-    return syntheticMethodFunction.apply(this);
-  }
-
-  public ClassReference getSyntheticContextReference() {
-    return syntheticContextReference;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    ExternalSyntheticStartupMethod that = (ExternalSyntheticStartupMethod) o;
-    return syntheticContextReference.equals(that.syntheticContextReference);
-  }
-
-  @Override
-  public int hashCode() {
-    return syntheticContextReference.hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return "S(" + syntheticContextReference.getTypeName() + ")";
-  }
-
-  public static class Builder implements SyntheticStartupMethodBuilder {
-
-    private ClassReference syntheticContextReference;
-
-    @Override
-    public Builder setSyntheticContextReference(ClassReference syntheticContextReference) {
-      this.syntheticContextReference = syntheticContextReference;
-      return this;
-    }
-
-    public ExternalSyntheticStartupMethod build() {
-      return new ExternalSyntheticStartupMethod(syntheticContextReference);
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
index b6e08bf..93dc0a0 100644
--- a/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
+++ b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
@@ -21,18 +21,15 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.profile.art.ArtProfileBuilder;
 import com.android.tools.r8.profile.art.ArtProfileBuilderUtils;
-import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
 import com.android.tools.r8.profile.art.HumanReadableArtProfileParser;
 import com.android.tools.r8.profile.art.HumanReadableArtProfileParserBuilder;
 import com.android.tools.r8.startup.StartupClassBuilder;
 import com.android.tools.r8.startup.StartupMethodBuilder;
 import com.android.tools.r8.startup.StartupProfileBuilder;
 import com.android.tools.r8.startup.StartupProfileProvider;
-import com.android.tools.r8.startup.SyntheticStartupMethodBuilder;
 import com.android.tools.r8.startup.profile.ExternalStartupClass;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
 import com.android.tools.r8.startup.profile.ExternalStartupMethod;
-import com.android.tools.r8.startup.profile.ExternalSyntheticStartupMethod;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringUtils;
@@ -49,8 +46,7 @@
   private static String startupInstrumentationTag = "startup";
 
   private static ArtProfileBuilder createStartupItemFactory(
-      Consumer<ExternalStartupItem> startupItemConsumer,
-      SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization) {
+      Consumer<ExternalStartupItem> startupItemConsumer) {
     StartupProfileBuilder startupProfileBuilder =
         new StartupProfileBuilder() {
           @Override
@@ -72,16 +68,6 @@
           }
 
           @Override
-          public StartupProfileBuilder addSyntheticStartupMethod(
-              Consumer<SyntheticStartupMethodBuilder> syntheticStartupMethodBuilderConsumer) {
-            ExternalSyntheticStartupMethod.Builder syntheticStartupMethodBuilder =
-                ExternalSyntheticStartupMethod.builder();
-            syntheticStartupMethodBuilderConsumer.accept(syntheticStartupMethodBuilder);
-            startupItemConsumer.accept(syntheticStartupMethodBuilder.build());
-            return this;
-          }
-
-          @Override
           public StartupProfileBuilder addHumanReadableArtProfile(
               TextInputStream textInputStream,
               Consumer<HumanReadableArtProfileParserBuilder> parserBuilderConsumer) {
@@ -90,8 +76,7 @@
           }
         };
     return ArtProfileBuilderUtils.createBuilderForArtProfileToStartupProfileConversion(
-        startupProfileBuilder,
-        syntheticToSyntheticContextGeneralization);
+        startupProfileBuilder);
   }
 
   public static ThrowableConsumer<D8TestBuilder>
@@ -135,41 +120,29 @@
   }
 
   public static void readStartupListFromFile(
-      Path path,
-      Consumer<ExternalStartupItem> startupItemConsumer,
-      SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization)
-      throws IOException {
+      Path path, Consumer<ExternalStartupItem> startupItemConsumer) throws IOException {
     TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
     HumanReadableArtProfileParser parser =
         HumanReadableArtProfileParser.builder()
             .setReporter(new Reporter(diagnostics))
-            .setProfileBuilder(
-                createStartupItemFactory(
-                    startupItemConsumer, syntheticToSyntheticContextGeneralization))
+            .setProfileBuilder(createStartupItemFactory(startupItemConsumer))
             .build();
     parser.parse(new UTF8TextInputStream(path), Origin.unknown());
     diagnostics.assertNoMessages();
   }
 
   public static ThrowingConsumer<D8TestRunResult, RuntimeException> removeStartupListFromStdout(
-      Consumer<ExternalStartupItem> startupItemConsumer,
-      SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization) {
-    return runResult ->
-        removeStartupListFromStdout(
-            runResult, startupItemConsumer, syntheticToSyntheticContextGeneralization);
+      Consumer<ExternalStartupItem> startupItemConsumer) {
+    return runResult -> removeStartupListFromStdout(runResult, startupItemConsumer);
   }
 
   public static void removeStartupListFromStdout(
-      D8TestRunResult runResult,
-      Consumer<ExternalStartupItem> startupItemConsumer,
-      SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization) {
+      D8TestRunResult runResult, Consumer<ExternalStartupItem> startupItemConsumer) {
     TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
     HumanReadableArtProfileParser parser =
         HumanReadableArtProfileParser.builder()
             .setReporter(new Reporter(diagnostics))
-            .setProfileBuilder(
-                createStartupItemFactory(
-                    startupItemConsumer, syntheticToSyntheticContextGeneralization))
+            .setProfileBuilder(createStartupItemFactory(startupItemConsumer))
             .build();
     StringBuilder stdoutBuilder = new StringBuilder();
     String startupDescriptorPrefix = "[" + startupInstrumentationTag + "] ";
@@ -202,12 +175,7 @@
                       startupProfileBuilder.addStartupMethod(
                           startupMethodBuilder ->
                               startupMethodBuilder.setMethodReference(
-                                  startupMethod.getReference())),
-                  syntheticStartupMethod ->
-                      startupProfileBuilder.addSyntheticStartupMethod(
-                          syntheticStartupMethodBuilder ->
-                              syntheticStartupMethodBuilder.setSyntheticContextReference(
-                                  syntheticStartupMethod.getSyntheticContextReference())));
+                                  startupMethod.getReference())));
             }
           }
 
