Make synthetic names instance fields.

Change-Id: I697a301fd93e4b043a82319b576fa4bfa7955c0e
diff --git a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
index 6a2d78d..5725955 100644
--- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
+++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
@@ -21,7 +21,6 @@
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.synthesis.CommittedItems;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.WorkList;
 import com.google.common.collect.Sets;
@@ -156,7 +155,7 @@
   public void processClass(DexProgramClass clazz) {
     if (appView
         .getSyntheticItems()
-        .isSyntheticOfKind(clazz.getType(), SyntheticKind.API_MODEL_OUTLINE)) {
+        .isSyntheticOfKind(clazz.getType(), kinds -> kinds.API_MODEL_OUTLINE)) {
       return;
     }
     findReferencedLibraryClasses(clazz.type);
@@ -235,7 +234,7 @@
         .appInfo()
         .getSyntheticItems()
         .ensureFixedClassFromType(
-            SyntheticKind.API_MODEL_STUB,
+            kinds -> kinds.API_MODEL_STUB,
             libraryClass.getType(),
             appView,
             classBuilder -> {
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index 4ff028a..5a2bffc 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.graph.DexValue.DexValueString;
 import com.android.tools.r8.graph.DexValue.DexValueType;
 import com.android.tools.r8.ir.desugar.CovariantReturnTypeAnnotationTransformer;
-import com.android.tools.r8.synthesis.SyntheticNaming;
+import com.android.tools.r8.synthesis.SyntheticItems;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Pair;
@@ -399,12 +399,12 @@
   }
 
   public static boolean hasSynthesizedClassAnnotation(
-      DexAnnotationSet annotations, DexItemFactory factory) {
-    return getSynthesizedClassAnnotationInfo(annotations, factory) != null;
+      DexAnnotationSet annotations, DexItemFactory factory, SyntheticItems synthetics) {
+    return getSynthesizedClassAnnotationInfo(annotations, factory, synthetics) != null;
   }
 
   public static SyntheticKind getSynthesizedClassAnnotationInfo(
-      DexAnnotationSet annotations, DexItemFactory factory) {
+      DexAnnotationSet annotations, DexItemFactory factory, SyntheticItems synthetics) {
     if (annotations.size() != 1) {
       return null;
     }
@@ -425,7 +425,7 @@
       return null;
     }
     SyntheticKind kind =
-        SyntheticNaming.SyntheticKind.fromId(kindElement.value.asDexValueInt().getValue());
+        synthetics.getNaming().fromId(kindElement.value.asDexValueInt().getValue());
     return kind;
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 34e4809..6259d4c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -35,6 +35,7 @@
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.ArrayUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.Int2StructuralItemArrayMap;
@@ -682,6 +683,12 @@
   public final StringConcatFactoryMembers stringConcatFactoryMembers =
       new StringConcatFactoryMembers();
 
+  private final SyntheticNaming syntheticNaming = new SyntheticNaming();
+
+  public SyntheticNaming getSyntheticNaming() {
+    return syntheticNaming;
+  }
+
   public final BiMap<DexType, DexType> primitiveToBoxed = HashBiMap.create(
       ImmutableMap.<DexType, DexType>builder()
           .put(booleanType, boxedBooleanType)
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index ee7bc18..afbda8d 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -124,7 +124,9 @@
     }
     reader.accept(
         new CreateDexClassVisitor<>(origin, classKind, reader.b, application, classConsumer),
-        new Attribute[] {SyntheticMarker.getMarkerAttributePrototype()},
+        new Attribute[] {
+          SyntheticMarker.getMarkerAttributePrototype(application.getFactory().getSyntheticNaming())
+        },
         parsingOptions);
 
     // Read marker.
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/SyntheticArgumentClass.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/SyntheticArgumentClass.java
index 88a4755..ec19e83 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/SyntheticArgumentClass.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/SyntheticArgumentClass.java
@@ -8,7 +8,7 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -50,21 +50,22 @@
       this.appView = appView;
     }
 
-    private DexProgramClass synthesizeClass(DexProgramClass context, SyntheticKind syntheticKind) {
+    private DexProgramClass synthesizeClass(
+        DexProgramClass context, SyntheticKindSelector syntheticKindSelector) {
       return appView
           .getSyntheticItems()
-          .createFixedClass(syntheticKind, context, appView, builder -> {});
+          .createFixedClass(syntheticKindSelector, context, appView, builder -> {});
     }
 
     public SyntheticArgumentClass build(Collection<MergeGroup> mergeGroups) {
       DexProgramClass context = getDeterministicContext(mergeGroups);
       List<DexType> syntheticArgumentTypes = new ArrayList<>();
       syntheticArgumentTypes.add(
-          synthesizeClass(context, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_1).getType());
+          synthesizeClass(context, kinds -> kinds.HORIZONTAL_INIT_TYPE_ARGUMENT_1).getType());
       syntheticArgumentTypes.add(
-          synthesizeClass(context, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_2).getType());
+          synthesizeClass(context, kinds -> kinds.HORIZONTAL_INIT_TYPE_ARGUMENT_2).getType());
       syntheticArgumentTypes.add(
-          synthesizeClass(context, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_3).getType());
+          synthesizeClass(context, kinds -> kinds.HORIZONTAL_INIT_TYPE_ARGUMENT_3).getType());
       return new SyntheticArgumentClass(syntheticArgumentTypes);
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index b799580b..67f2c14 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -94,7 +94,7 @@
         && getMethodProviderOrNull(instruction.asInvoke().getMethod()) != null
         && !appView
             .getSyntheticItems()
-            .isSyntheticOfKind(context.getContextType(), SyntheticKind.BACKPORT_WITH_FORWARDING);
+            .isSyntheticOfKind(context.getContextType(), kinds -> kinds.BACKPORT_WITH_FORWARDING);
   }
 
   public static List<DexMethod> generateListOfBackportedMethods(
@@ -1575,8 +1575,8 @@
       this.methodName = methodName;
     }
 
-    protected SyntheticKind getSyntheticKind() {
-      return SyntheticNaming.SyntheticKind.BACKPORT;
+    protected SyntheticKind getSyntheticKind(SyntheticNaming naming) {
+      return naming.BACKPORT;
     }
 
     @Override
@@ -1596,7 +1596,7 @@
       return appView
           .getSyntheticItems()
           .createMethod(
-              getSyntheticKind(),
+              this::getSyntheticKind,
               methodProcessingContext.createUniqueContext(),
               appView,
               builder ->
@@ -1644,8 +1644,8 @@
     }
 
     @Override
-    protected SyntheticKind getSyntheticKind() {
-      return SyntheticKind.BACKPORT_WITH_FORWARDING;
+    protected SyntheticKind getSyntheticKind(SyntheticNaming naming) {
+      return naming.BACKPORT_WITH_FORWARDING;
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
index aa2ecfa..e642655 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
@@ -28,7 +28,6 @@
 import com.android.tools.r8.ir.desugar.FreshLocalProvider;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
 import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.TraversalContinuation;
 import com.google.common.collect.ImmutableList;
@@ -171,7 +170,7 @@
     return appView
         .getSyntheticItems()
         .createMethod(
-            SyntheticKind.API_MODEL_OUTLINE,
+            kinds -> kinds.API_MODEL_OUTLINE,
             context,
             appView,
             syntheticMethodBuilder -> {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
index 1d55e7e..8853e8b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.FreshLocalProvider;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.Box;
 import java.util.Collection;
 import java.util.HashMap;
@@ -117,7 +116,7 @@
         appView
             .getSyntheticItems()
             .createClass(
-                SyntheticKind.CONST_DYNAMIC,
+                kinds -> kinds.CONST_DYNAMIC,
                 methodProcessingContext.createUniqueContext(),
                 appView,
                 builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index 520b5ea..f041fe3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -36,7 +36,6 @@
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryClasspathWrapperSynthesizeEventConsumer;
 import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConversionCfCodeProvider;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringDiagnostic;
 import com.google.common.collect.Iterables;
@@ -126,7 +125,7 @@
   static boolean isAPIConversionSyntheticType(
       DexType type, DesugaredLibraryWrapperSynthesizer wrapperSynthesizor, AppView<?> appView) {
     return wrapperSynthesizor.isSyntheticWrapper(type)
-        || appView.getSyntheticItems().isSyntheticOfKind(type, SyntheticKind.API_CONVERSION);
+        || appView.getSyntheticItems().isSyntheticOfKind(type, kinds -> kinds.API_CONVERSION);
   }
 
   public static boolean isVivifiedType(DexType type) {
@@ -429,7 +428,7 @@
         appView
             .getSyntheticItems()
             .createMethod(
-                SyntheticKind.API_CONVERSION_PARAMETERS,
+                kinds -> kinds.API_CONVERSION_PARAMETERS,
                 methodProcessingContext.createUniqueContext(),
                 appView,
                 builder ->
@@ -534,7 +533,7 @@
         appView
             .getSyntheticItems()
             .createMethod(
-                SyntheticKind.API_CONVERSION,
+                kinds -> kinds.API_CONVERSION,
                 methodProcessingContext.createUniqueContext(),
                 appView,
                 builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryEnumConversionSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryEnumConversionSynthesizer.java
index 60a2281..d69a158 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryEnumConversionSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryEnumConversionSynthesizer.java
@@ -21,7 +21,6 @@
 import com.android.tools.r8.synthesis.SyntheticClasspathClassBuilder;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder.SyntheticCodeGenerator;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.synthesis.SyntheticProgramClassBuilder;
 import com.google.common.collect.Iterables;
 
@@ -116,7 +115,7 @@
     DexProgramClass enumConversion =
         appView
             .getSyntheticItems()
-            .getExistingFixedClass(SyntheticKind.ENUM_CONVERSION, clazz, appView);
+            .getExistingFixedClass(kinds -> kinds.ENUM_CONVERSION, clazz, appView);
     DexMethod method =
         factory.createMethod(
             enumConversion.type, factory.createProto(destType, srcType), factory.convertMethodName);
@@ -137,7 +136,7 @@
     return appView
         .getSyntheticItems()
         .ensureFixedClass(
-            SyntheticKind.ENUM_CONVERSION,
+            kinds -> kinds.ENUM_CONVERSION,
             programContext,
             appView,
             builder -> buildEnumMethodsWithCode(builder, enumFields, type, vivifiedType),
@@ -150,14 +149,14 @@
     if (context.isProgramClass()) {
       return appView
           .getSyntheticItems()
-          .getExistingFixedClass(SyntheticKind.ENUM_CONVERSION, context, appView);
+          .getExistingFixedClass(kinds -> kinds.ENUM_CONVERSION, context, appView);
     }
     DexType type = context.type;
     DexType vivifiedType = vivifiedTypeFor(context.type, appView);
     return appView
         .getSyntheticItems()
         .ensureFixedClasspathClass(
-            SyntheticKind.ENUM_CONVERSION,
+            kinds -> kinds.ENUM_CONVERSION,
             context.asClasspathOrLibraryClass(),
             appView,
             builder -> buildEnumMethodsWithoutCode(builder, type, vivifiedType),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index e1fbb96..79f1ff2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -40,8 +40,8 @@
 import com.android.tools.r8.position.MethodPosition;
 import com.android.tools.r8.position.Position;
 import com.android.tools.r8.synthesis.SyntheticClassBuilder;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.StringDiagnostic;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -108,8 +108,8 @@
   }
 
   public boolean isSyntheticWrapper(DexType type) {
-    return appView.getSyntheticItems().isSyntheticOfKind(type, SyntheticKind.WRAPPER)
-        || appView.getSyntheticItems().isSyntheticOfKind(type, SyntheticKind.VIVIFIED_WRAPPER);
+    return appView.getSyntheticItems().isSyntheticOfKind(type, kinds -> kinds.WRAPPER)
+        || appView.getSyntheticItems().isSyntheticOfKind(type, kinds -> kinds.VIVIFIED_WRAPPER);
   }
 
   public boolean shouldConvert(DexType type, DexMethod method) {
@@ -202,7 +202,7 @@
         appView
             .getSyntheticItems()
             .createMethod(
-                SyntheticKind.ARRAY_CONVERSION,
+                kinds -> kinds.ARRAY_CONVERSION,
                 contextSupplier.get(),
                 appView,
                 builder ->
@@ -351,7 +351,7 @@
     DexType vivifiedType = vivifiedTypeFor(type);
     DexClass wrapper =
         ensureClasspathWrapper(
-            SyntheticKind.WRAPPER,
+            kinds -> kinds.WRAPPER,
             vivifiedType,
             type,
             classpathOrLibraryContext,
@@ -363,7 +363,7 @@
                     DesugaredLibraryWrapperSynthesizer::codeForClasspathMethod));
     DexClass vivifiedWrapper =
         ensureClasspathWrapper(
-            SyntheticKind.VIVIFIED_WRAPPER,
+            kinds -> kinds.VIVIFIED_WRAPPER,
             type,
             vivifiedType,
             classpathOrLibraryContext,
@@ -382,8 +382,8 @@
     DexClass vivifiedWrapper;
     DexClass wrapper;
     assert appView.options().isDesugaredLibraryCompilation();
-    wrapper = getExistingProgramWrapper(context, SyntheticKind.WRAPPER);
-    vivifiedWrapper = getExistingProgramWrapper(context, SyntheticKind.VIVIFIED_WRAPPER);
+    wrapper = getExistingProgramWrapper(context, kinds -> kinds.WRAPPER);
+    vivifiedWrapper = getExistingProgramWrapper(context, kinds -> kinds.VIVIFIED_WRAPPER);
     DexField wrapperField = getWrapperUniqueField(wrapper);
     DexField vivifiedWrapperField = getWrapperUniqueField(vivifiedWrapper);
     return new WrapperConversions(
@@ -391,8 +391,9 @@
         getConversion(vivifiedWrapper, wrapperField.type, vivifiedWrapperField.type));
   }
 
-  private DexProgramClass getExistingProgramWrapper(DexClass context, SyntheticKind kind) {
-    return appView.getSyntheticItems().getExistingFixedClass(kind, context, appView);
+  private DexProgramClass getExistingProgramWrapper(
+      DexClass context, SyntheticKindSelector kindSelector) {
+    return appView.getSyntheticItems().getExistingFixedClass(kindSelector, context, appView);
   }
 
   private DexMethod getConversion(DexClass wrapper, DexType returnType, DexType argType) {
@@ -412,7 +413,7 @@
   }
 
   private DexProgramClass ensureProgramWrapper(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       DexType wrappingType,
       DexType wrappedType,
       DexProgramClass programContext,
@@ -422,7 +423,7 @@
     return appView
         .getSyntheticItems()
         .ensureFixedClass(
-            kind,
+            kindSelector,
             programContext,
             appView,
             builder -> buildWrapper(wrappingType, wrappedType, programContext, builder),
@@ -432,7 +433,7 @@
   }
 
   private DexClasspathClass ensureClasspathWrapper(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       DexType wrappingType,
       DexType wrappedType,
       ClasspathOrLibraryClass classpathOrLibraryContext,
@@ -442,7 +443,7 @@
     return appView
         .getSyntheticItems()
         .ensureFixedClasspathClass(
-            kind,
+            kindSelector,
             classpathOrLibraryContext,
             appView,
             builder -> {
@@ -459,7 +460,10 @@
   }
 
   private void getExistingProgramConversionMethod(
-      SyntheticKind kind, DexProgramClass context, DexClass wrapper, DexClass reverseWrapper) {
+      SyntheticKindSelector kindSelector,
+      DexProgramClass context,
+      DexClass wrapper,
+      DexClass reverseWrapper) {
     DexField wrapperField = getWrapperUniqueField(wrapper);
     DexField reverseWrapperField = getWrapperUniqueField(reverseWrapper);
     DexProto proto = factory.createProto(reverseWrapperField.type, wrapperField.type);
@@ -468,7 +472,7 @@
         .ensureFixedClassMethod(
             factory.convertMethodName,
             proto,
-            kind,
+            kindSelector,
             context,
             appView,
             ignored -> {},
@@ -694,18 +698,18 @@
     DexProgramClass programContext = context.asProgramClass();
     DexClass wrapper =
         ensureProgramWrapper(
-            SyntheticKind.WRAPPER, vivifiedTypeFor(type), type, programContext, eventConsumer);
+            kinds -> kinds.WRAPPER, vivifiedTypeFor(type), type, programContext, eventConsumer);
     DexClass vivifiedWrapper =
         ensureProgramWrapper(
-            SyntheticKind.VIVIFIED_WRAPPER,
+            kinds -> kinds.VIVIFIED_WRAPPER,
             type,
             vivifiedTypeFor(type),
             programContext,
             eventConsumer);
     getExistingProgramConversionMethod(
-        SyntheticKind.WRAPPER, programContext, wrapper, vivifiedWrapper);
+        kinds -> kinds.WRAPPER, programContext, wrapper, vivifiedWrapper);
     getExistingProgramConversionMethod(
-        SyntheticKind.VIVIFIED_WRAPPER, programContext, vivifiedWrapper, wrapper);
+        kinds -> kinds.VIVIFIED_WRAPPER, programContext, vivifiedWrapper, wrapper);
   }
 
   private void ensureProgramWrappersVirtualMethods(
@@ -713,7 +717,7 @@
       Iterable<DexMethod> methods,
       CfClassSynthesizerDesugaringEventConsumer eventConsumer,
       ClassSynthesisDesugaringContext processingContext) {
-    DexProgramClass wrapper = getExistingProgramWrapper(context, SyntheticKind.WRAPPER);
+    DexProgramClass wrapper = getExistingProgramWrapper(context, kinds -> kinds.WRAPPER);
     DexEncodedField wrapperField = getWrapperUniqueEncodedField(wrapper);
     wrapper.addVirtualMethods(
         synthesizeVirtualMethodsForTypeWrapper(
@@ -726,7 +730,7 @@
                     eventConsumer,
                     () -> processingContext.createUniqueContext(wrapper))));
     DexProgramClass vivifiedWrapper =
-        getExistingProgramWrapper(context, SyntheticKind.VIVIFIED_WRAPPER);
+        getExistingProgramWrapper(context, kinds -> kinds.VIVIFIED_WRAPPER);
     DexEncodedField vivifiedWrapperField = getWrapperUniqueEncodedField(vivifiedWrapper);
     vivifiedWrapper.addVirtualMethods(
         synthesizeVirtualMethodsForVivifiedTypeWrapper(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
index 6102e1a..1fa4b75 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
@@ -19,6 +19,7 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterSynthesizerEventConsumer.DesugaredLibraryRetargeterL8SynthesizerEventConsumer;
 import com.android.tools.r8.ir.synthetic.EmulateDispatchSyntheticCfCodeProvider;
 import com.android.tools.r8.synthesis.SyntheticClassBuilder;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import java.util.LinkedHashMap;
 
@@ -46,7 +47,7 @@
             .ensureFixedClasspathMethodFromType(
                 retarget.getName(),
                 retarget.getProto(),
-                SyntheticKind.RETARGET_STUB,
+                kinds -> kinds.RETARGET_STUB,
                 retarget.getHolderType(),
                 appView,
                 ignored -> {},
@@ -70,14 +71,20 @@
     return ensureRetargetMethod(forwardingMethod(descriptor), eventConsumer);
   }
 
+  private boolean verifyKind(DerivedMethod method, SyntheticKindSelector kindSelector) {
+    SyntheticKind kind = kindSelector.select(appView.getSyntheticItems().getNaming());
+    assert method.getHolderKind().equals(kind);
+    return true;
+  }
+
   private DexMethod emulatedHolderDispatchMethod(DexType holder, DerivedMethod method) {
-    assert method.getHolderKind() == SyntheticKind.RETARGET_CLASS;
+    assert verifyKind(method, kinds -> kinds.RETARGET_CLASS);
     DexProto newProto = appView.dexItemFactory().prependHolderToProto(method.getMethod());
     return appView.dexItemFactory().createMethod(holder, newProto, method.getName());
   }
 
   DexMethod emulatedInterfaceDispatchMethod(DexType holder, DerivedMethod method) {
-    assert method.getHolderKind() == SyntheticKind.RETARGET_INTERFACE;
+    assert verifyKind(method, kinds -> kinds.RETARGET_INTERFACE);
     return appView.dexItemFactory().createMethod(holder, method.getProto(), method.getName());
   }
 
@@ -102,7 +109,7 @@
           appView
               .getSyntheticItems()
               .getExistingFixedClass(
-                  emulatedDispatchMethod.getHolderKind(), holderContext, appView);
+                  ignored -> emulatedDispatchMethod.getHolderKind(), holderContext, appView);
       DexMethod dispatchMethod =
           emulatedHolderDispatchMethod(syntheticClass.type, emulatedDispatchMethod);
       assert syntheticClass.lookupMethod(dispatchMethod) != null;
@@ -115,7 +122,7 @@
           appView
               .getSyntheticItems()
               .ensureFixedClasspathClass(
-                  SyntheticKind.RETARGET_CLASS,
+                  kinds -> kinds.RETARGET_CLASS,
                   context,
                   appView,
                   classBuilder ->
@@ -140,7 +147,7 @@
     appView
         .getSyntheticItems()
         .ensureFixedClass(
-            emulatedDispatchMethod.getHolderKind(),
+            ignored -> emulatedDispatchMethod.getHolderKind(),
             holderContext,
             appView,
             classBuilder -> buildHolderDispatchMethod(classBuilder, itfClass, descriptor, null),
@@ -156,14 +163,14 @@
     if (appView.options().isDesugaredLibraryCompilation()) {
       return appView
           .getSyntheticItems()
-          .getExistingFixedClass(itfMethod.getHolderKind(), itfContext, appView);
+          .getExistingFixedClass(ignored -> itfMethod.getHolderKind(), itfContext, appView);
     }
     ClasspathOrLibraryClass context = itfContext.asClasspathOrLibraryClass();
     assert context != null;
     return appView
         .getSyntheticItems()
         .ensureFixedClasspathClass(
-            SyntheticKind.RETARGET_INTERFACE,
+            kinds -> kinds.RETARGET_INTERFACE,
             context,
             appView,
             classBuilder -> buildInterfaceDispatchMethod(classBuilder, descriptor),
@@ -180,7 +187,7 @@
     return appView
         .getSyntheticItems()
         .ensureFixedClass(
-            itfMethod.getHolderKind(),
+            ignore -> itfMethod.getHolderKind(),
             itfContext,
             appView,
             classBuilder -> buildInterfaceDispatchMethod(classBuilder, descriptor),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
index 182202b..5f385c5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
@@ -16,7 +16,7 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedInterfaceDescriptor;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.WorkList;
 import com.google.common.collect.Sets;
 import java.util.ArrayList;
@@ -68,7 +68,8 @@
 
   private EmulatedDispatchMethodDescriptor computeEmulatedDispatchDescriptor(
       DexMethod method, HumanRewritingFlags rewritingFlags, AppInfoWithClassHierarchy appInfo) {
-    DerivedMethod forwardingMethod = new DerivedMethod(method, SyntheticKind.COMPANION_CLASS);
+    SyntheticNaming syntheticNaming = appInfo.getSyntheticItems().getNaming();
+    DerivedMethod forwardingMethod = new DerivedMethod(method, syntheticNaming.COMPANION_CLASS);
     DexMethod itfDexMethod =
         appInfo
             .dexItemFactory()
@@ -78,7 +79,7 @@
                 method.getName());
     DerivedMethod interfaceMethod = new DerivedMethod(itfDexMethod);
     DerivedMethod dispatchMethod =
-        new DerivedMethod(method, SyntheticKind.EMULATED_INTERFACE_CLASS);
+        new DerivedMethod(method, syntheticNaming.EMULATED_INTERFACE_CLASS);
     LinkedHashMap<DexType, DerivedMethod> dispatchCases = getDispatchCases(rewritingFlags, method);
     return new EmulatedDispatchMethodDescriptor(
         interfaceMethod, dispatchMethod, forwardingMethod, dispatchCases);
@@ -109,6 +110,7 @@
       }
     }
     if (subInterfaces != null) {
+      SyntheticNaming syntheticNaming = appInfo.getSyntheticItems().getNaming();
       for (int i = subInterfaces.size() - 1; i >= 0; i--) {
         DexClass subInterfaceClass = appInfo.definitionFor(subInterfaces.get(i));
         assert subInterfaceClass != null;
@@ -119,7 +121,8 @@
           assert result.isDefaultMethod();
           DexMethod reference = result.getReference();
           extraDispatchCases.put(
-              subInterfaceClass.type, new DerivedMethod(reference, SyntheticKind.COMPANION_CLASS));
+              subInterfaceClass.type,
+              new DerivedMethod(reference, syntheticNaming.COMPANION_CLASS));
         }
       }
     } else {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
index 6db6518..f64a3d0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
@@ -15,7 +15,7 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.TraversalContinuation;
 import com.google.common.collect.Sets;
 import java.util.LinkedHashMap;
@@ -123,11 +123,12 @@
       return;
     }
     // TODO(b/184026720): Implement library boundaries.
+    SyntheticNaming syntheticNaming = appInfo.getSyntheticItems().getNaming();
     DerivedMethod forwardingMethod = new DerivedMethod(forwardingDexMethod);
     DerivedMethod interfaceMethod =
-        new DerivedMethod(src.getReference(), SyntheticKind.RETARGET_INTERFACE);
+        new DerivedMethod(src.getReference(), syntheticNaming.RETARGET_INTERFACE);
     DerivedMethod dispatchMethod =
-        new DerivedMethod(src.getReference(), SyntheticKind.RETARGET_CLASS);
+        new DerivedMethod(src.getReference(), syntheticNaming.RETARGET_CLASS);
     LinkedHashMap<DexType, DerivedMethod> dispatchCases = new LinkedHashMap<>();
     builder.putEmulatedVirtualRetarget(
         src.getReference(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
index dab2a94..65379b5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
@@ -4,12 +4,12 @@
 
 package com.android.tools.r8.ir.desugar.itf;
 
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
-
 public class InterfaceDesugaringForTesting {
 
+  public static final String EMULATED_INTERFACE_CLASS_SUFFIX = "$-EL";
+
   public static String getEmulateLibraryClassNameSuffix() {
-    return SyntheticKind.EMULATED_INTERFACE_CLASS.getDescriptor();
+    return EMULATED_INTERFACE_CLASS_SUFFIX;
   }
 
   public static String getCompanionClassNameSuffix() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index 5d007195..dc739bb 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -41,6 +41,7 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedInterfaceDescriptor;
 import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceSynthesizerEventConsumer.ClasspathEmulatedInterfaceSynthesizerEventConsumer;
 import com.android.tools.r8.synthesis.SyntheticClassBuilder;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.InternalOptions;
@@ -120,8 +121,14 @@
     return true;
   }
 
+  public boolean verifyKind(DerivedMethod method, SyntheticKindSelector kindSelector) {
+    SyntheticKind kind = kindSelector.select(appView.getSyntheticItems().getNaming());
+    assert method.getHolderKind().equals(kind);
+    return true;
+  }
+
   DexMethod emulatedInterfaceDispatchMethod(DerivedMethod method, DexType holder) {
-    assert method.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
+    assert verifyKind(method, kinds -> kinds.EMULATED_INTERFACE_CLASS);
     DexProto newProto = appView.dexItemFactory().prependHolderToProto(method.getMethod());
     return appView.dexItemFactory().createMethod(holder, newProto, method.getName());
   }
@@ -168,7 +175,7 @@
     return appView
         .getSyntheticItems()
         .ensureFixedClasspathClassFromType(
-            SyntheticKind.EMULATED_INTERFACE_MARKER_CLASS,
+            kinds -> kinds.EMULATED_INTERFACE_MARKER_CLASS,
             type,
             appView,
             SyntheticClassBuilder::setInterface,
@@ -247,7 +254,7 @@
     if (method.getHolderKind() == null) {
       return method.getMethod();
     }
-    assert method.getHolderKind() == SyntheticKind.COMPANION_CLASS;
+    assert verifyKind(method, kinds -> kinds.COMPANION_CLASS);
     DexClassAndMethod resolvedMethod =
         appView.appInfoForDesugaring().resolveMethod(method.getMethod(), true).getResolutionPair();
     return ensureDefaultAsMethodOfCompanionClassStub(resolvedMethod).getReference();
@@ -256,20 +263,20 @@
   DexClassAndMethod ensureEmulatedInterfaceDispatchMethod(
       DerivedMethod emulatedDispatchMethod,
       ClasspathEmulatedInterfaceSynthesizerEventConsumer eventConsumer) {
-    assert emulatedDispatchMethod.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
+    assert verifyKind(emulatedDispatchMethod, kinds -> kinds.EMULATED_INTERFACE_CLASS);
     DexClassAndMethod method =
         appView
             .appInfoForDesugaring()
             .resolveMethod(emulatedDispatchMethod.getMethod(), true)
             .getResolutionPair();
-    assert emulatedDispatchMethod.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
+    assert verifyKind(emulatedDispatchMethod, kinds -> kinds.EMULATED_INTERFACE_CLASS);
     if (method.isProgramMethod()) {
       assert appView.options().isDesugaredLibraryCompilation();
       DexProgramClass emulatedInterface =
           appView
               .getSyntheticItems()
               .getExistingFixedClass(
-                  SyntheticKind.EMULATED_INTERFACE_CLASS,
+                  kinds -> kinds.EMULATED_INTERFACE_CLASS,
                   method.asProgramMethod().getHolder(),
                   appView);
       DexMethod emulatedInterfaceMethod =
@@ -286,7 +293,7 @@
         .ensureFixedClasspathClassMethod(
             emulatedInterfaceMethod.getName(),
             emulatedInterfaceMethod.getProto(),
-            SyntheticKind.EMULATED_INTERFACE_CLASS,
+            kinds -> kinds.EMULATED_INTERFACE_CLASS,
             method.getHolder().asClasspathOrLibraryClass(),
             appView,
             classBuilder -> {},
@@ -420,7 +427,7 @@
         .ensureFixedClasspathClassMethod(
             companionMethodReference.getName(),
             companionMethodReference.getProto(),
-            SyntheticKind.COMPANION_CLASS,
+            kinds -> kinds.COMPANION_CLASS,
             context,
             appView,
             classBuilder -> {},
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 85efd2b..2ae7d7d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -43,7 +43,6 @@
 import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.MethodPosition;
-import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.collections.ProgramMethodSet;
 import com.android.tools.r8.utils.structural.Ordered;
@@ -382,7 +381,7 @@
                     appView
                         .getSyntheticItems()
                         .createMethod(
-                            SyntheticNaming.SyntheticKind.STATIC_INTERFACE_CALL,
+                            kind -> kind.STATIC_INTERFACE_CALL,
                             methodProcessingContext.createUniqueContext(),
                             appView,
                             syntheticMethodBuilder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index 06f2d76..5d14741 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -26,7 +26,6 @@
 import com.android.tools.r8.graph.NestedGraphLens;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.Pair;
 import com.android.tools.r8.utils.collections.BidirectionalManyToManyRepresentativeMap;
 import com.android.tools.r8.utils.collections.BidirectionalManyToOneRepresentativeMap;
@@ -96,7 +95,7 @@
         .ensureFixedClassMethod(
             methodName,
             methodProto,
-            SyntheticKind.COMPANION_CLASS,
+            kinds -> kinds.COMPANION_CLASS,
             iface,
             appView,
             builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
index 8d14980..b8b50d9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceSynthesizerEventConsumer.L8ProgramEmulatedInterfaceSynthesizerEventConsumer;
 import com.android.tools.r8.ir.synthetic.EmulateDispatchSyntheticCfCodeProvider;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
-import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.synthesis.SyntheticProgramClassBuilder;
 import com.android.tools.r8.utils.StringDiagnostic;
 import java.util.LinkedHashMap;
@@ -48,7 +47,7 @@
     return appView
         .getSyntheticItems()
         .ensureFixedClass(
-            SyntheticNaming.SyntheticKind.EMULATED_INTERFACE_CLASS,
+            kinds -> kinds.EMULATED_INTERFACE_CLASS,
             emulatedInterface,
             appView,
             builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
index f7e8d1a..d336a16 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
@@ -30,7 +30,6 @@
 import com.android.tools.r8.ir.desugar.LambdaClass;
 import com.android.tools.r8.ir.desugar.LambdaDescriptor;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
-import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.Box;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
@@ -165,7 +164,7 @@
         appView
             .getSyntheticItems()
             .createClass(
-                SyntheticNaming.SyntheticKind.LAMBDA,
+                kinds -> kinds.LAMBDA,
                 methodProcessingContext.createUniqueContext(),
                 appView,
                 builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 8f658a3..4da9973 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -36,7 +36,6 @@
 import com.android.tools.r8.ir.desugar.FreshLocalProvider;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
 import com.android.tools.r8.ir.desugar.ProgramAdditions;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
@@ -444,7 +443,7 @@
                   return appView
                       .getSyntheticItems()
                       .createFixedClass(
-                          SyntheticKind.INIT_TYPE_ARGUMENT,
+                          kinds -> kinds.INIT_TYPE_ARGUMENT,
                           method.asProgramMethod().getHolder(),
                           appView,
                           builder -> {})
@@ -454,7 +453,7 @@
                   return appView
                       .getSyntheticItems()
                       .ensureFixedClasspathClass(
-                          SyntheticKind.INIT_TYPE_ARGUMENT,
+                          kinds -> kinds.INIT_TYPE_ARGUMENT,
                           method.asClasspathMethod().getHolder(),
                           appView,
                           ignored -> {},
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
index a6fcf97..3f17800 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
@@ -51,7 +51,6 @@
 import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordEqualsCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordGetFieldsAsObjectsCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.SyntheticCfCodeProvider;
-import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
@@ -285,7 +284,7 @@
     return appView
         .getSyntheticItems()
         .createMethod(
-            SyntheticNaming.SyntheticKind.RECORD_HELPER,
+            kinds -> kinds.RECORD_HELPER,
             methodProcessingContext.createUniqueContext(),
             appView,
             builder ->
@@ -374,7 +373,7 @@
     appView
         .getSyntheticItems()
         .ensureFixedClassFromType(
-            SyntheticNaming.SyntheticKind.RECORD_TAG,
+            kinds -> kinds.RECORD_TAG,
             factory.recordType,
             appView,
             builder -> {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
index 476859a..017ba89 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
@@ -22,7 +22,7 @@
 import com.android.tools.r8.ir.desugar.FreshLocalProvider;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
 import com.android.tools.r8.ir.desugar.backports.BackportedMethods;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
@@ -82,7 +82,7 @@
     DexProto proto =
         factory.createProto(factory.voidType, factory.throwableType, factory.throwableType);
     return createAndCallSyntheticMethod(
-        SyntheticKind.BACKPORT,
+        kinds -> kinds.BACKPORT,
         proto,
         BackportedMethods::ThrowableMethods_addSuppressed,
         methodProcessingContext,
@@ -98,7 +98,7 @@
         factory.createProto(
             factory.createArrayType(1, factory.throwableType), factory.throwableType);
     return createAndCallSyntheticMethod(
-        SyntheticKind.BACKPORT,
+        kinds -> kinds.BACKPORT,
         proto,
         BackportedMethods::ThrowableMethods_getSuppressed,
         methodProcessingContext,
@@ -111,7 +111,7 @@
       MethodProcessingContext methodProcessingContext) {
     // Synthesize a new method.
     return createAndCallSyntheticMethod(
-        SyntheticKind.TWR_CLOSE_RESOURCE,
+        kinds -> kinds.TWR_CLOSE_RESOURCE,
         twrCloseResourceProto,
         BackportedMethods::CloseResourceMethod_closeResourceImpl,
         methodProcessingContext,
@@ -120,7 +120,7 @@
   }
 
   private ImmutableList<CfInstruction> createAndCallSyntheticMethod(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       DexProto proto,
       BiFunction<InternalOptions, DexMethod, CfCode> generator,
       MethodProcessingContext methodProcessingContext,
@@ -130,7 +130,7 @@
         appView
             .getSyntheticItems()
             .createMethod(
-                kind,
+                kindSelector,
                 methodProcessingContext.createUniqueContext(),
                 appView,
                 builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
index 3edb51f..f04e328 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
@@ -68,7 +68,6 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
 import com.android.tools.r8.utils.ListUtils;
@@ -1525,7 +1524,7 @@
           appView
               .getSyntheticItems()
               .createMethod(
-                  SyntheticKind.OUTLINE,
+                  kinds -> kinds.OUTLINE,
                   methodProcessingContext.createUniqueContext(),
                   appView,
                   builder -> {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
index 260a5a3..1288379 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
@@ -24,7 +24,6 @@
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.desugar.ServiceLoaderSourceCode;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.BooleanBox;
 import com.android.tools.r8.utils.ListUtils;
 import com.google.common.collect.ImmutableList;
@@ -198,7 +197,7 @@
         appView
             .getSyntheticItems()
             .createMethod(
-                SyntheticKind.SERVICE_LOADER,
+                kinds -> kinds.SERVICE_LOADER,
                 methodProcessingContext.createUniqueContext(),
                 appView,
                 builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java b/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
index 5639925..257fd7d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.optimize.templates.CfUtilityMethodsForCodeOptimizations;
 import com.android.tools.r8.synthesis.SyntheticItems;
-import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.InternalOptions;
 
 public class UtilityMethodsForCodeOptimizations {
@@ -36,7 +35,7 @@
     SyntheticItems syntheticItems = appView.getSyntheticItems();
     ProgramMethod syntheticMethod =
         syntheticItems.createMethod(
-            SyntheticNaming.SyntheticKind.TO_STRING_IF_NOT_NULL,
+            kinds -> kinds.TO_STRING_IF_NOT_NULL,
             methodProcessingContext.createUniqueContext(),
             appView,
             builder ->
@@ -65,7 +64,7 @@
     UniqueContext positionContext = methodProcessingContext.createUniqueContext();
     ProgramMethod syntheticMethod =
         syntheticItems.createMethod(
-            SyntheticNaming.SyntheticKind.THROW_CCE_IF_NOT_NULL,
+            kinds -> kinds.THROW_CCE_IF_NOT_NULL,
             positionContext,
             appView,
             builder ->
@@ -95,7 +94,7 @@
     SyntheticItems syntheticItems = appView.getSyntheticItems();
     ProgramMethod syntheticMethod =
         syntheticItems.createMethod(
-            SyntheticNaming.SyntheticKind.THROW_IAE,
+            kinds -> kinds.THROW_IAE,
             methodProcessingContext.createUniqueContext(),
             appView,
             builder ->
@@ -123,7 +122,7 @@
     SyntheticItems syntheticItems = appView.getSyntheticItems();
     ProgramMethod syntheticMethod =
         syntheticItems.createMethod(
-            SyntheticNaming.SyntheticKind.THROW_ICCE,
+            kinds -> kinds.THROW_ICCE,
             methodProcessingContext.createUniqueContext(),
             appView,
             builder ->
@@ -153,7 +152,7 @@
     SyntheticItems syntheticItems = appView.getSyntheticItems();
     ProgramMethod syntheticMethod =
         syntheticItems.createMethod(
-            SyntheticNaming.SyntheticKind.THROW_NSME,
+            kinds -> kinds.THROW_NSME,
             methodProcessingContext.createUniqueContext(),
             appView,
             builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index 3c8bdbc..e19e0b6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -48,7 +48,6 @@
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
 import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfo;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.ImmutableArrayUtils;
 import com.android.tools.r8.utils.OptionalBool;
 import com.android.tools.r8.utils.SetUtils;
@@ -178,7 +177,7 @@
               appView
                   .getSyntheticItems()
                   .createMethod(
-                      SyntheticKind.ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD,
+                      kinds -> kinds.ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD,
                       // Use the context of the checkNotNull() method to ensure the method is placed
                       // in the same feature split.
                       processorContext
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
index ed8958d..6741924 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
@@ -22,7 +22,6 @@
 import com.android.tools.r8.ir.synthetic.EnumUnboxingCfCodeProvider;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder.SyntheticCodeGenerator;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 
 public class LocalEnumUnboxingUtilityClass extends EnumUnboxingUtilityClass {
 
@@ -123,7 +122,7 @@
         .ensureFixedClassMethod(
             methodName,
             methodProto,
-            SyntheticKind.ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
+            kinds -> kinds.ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
             getSynthesizingContext(),
             appView,
             emptyConsumer(),
@@ -174,7 +173,7 @@
           appView
               .getSyntheticItems()
               .createFixedClass(
-                  SyntheticKind.ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
+                  kinds -> kinds.ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
                   enumToUnbox,
                   appView,
                   builder -> builder.setUseSortedMethodBacking(true));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/SharedEnumUnboxingUtilityClass.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/SharedEnumUnboxingUtilityClass.java
index 096c2cf..55d5c50 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/SharedEnumUnboxingUtilityClass.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/SharedEnumUnboxingUtilityClass.java
@@ -36,7 +36,6 @@
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.FieldAccessInfoCollectionModifier;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder.SyntheticCodeGenerator;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.ConsumerUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
@@ -139,7 +138,7 @@
         .ensureFixedClassMethod(
             methodName,
             methodProto,
-            SyntheticKind.ENUM_UNBOXING_SHARED_UTILITY_CLASS,
+            kinds -> kinds.ENUM_UNBOXING_SHARED_UTILITY_CLASS,
             getSynthesizingContext(),
             appView,
             ConsumerUtils.emptyConsumer(),
@@ -202,7 +201,7 @@
           appView
               .getSyntheticItems()
               .createFixedClass(
-                  SyntheticKind.ENUM_UNBOXING_SHARED_UTILITY_CLASS,
+                  kinds -> kinds.ENUM_UNBOXING_SHARED_UTILITY_CLASS,
                   synthesizingContext,
                   appView,
                   classBuilder -> {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
index 4599085..1ab29eb 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
@@ -39,7 +39,6 @@
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.KeepFieldInfo;
 import com.android.tools.r8.shaking.KeepMethodInfo;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.AccessUtils;
 import com.android.tools.r8.utils.BooleanBox;
 import com.android.tools.r8.utils.IntBox;
@@ -812,7 +811,7 @@
           appView
               .getSyntheticItems()
               .createClass(
-                  SyntheticKind.NON_FIXED_INIT_TYPE_ARGUMENT,
+                  kinds -> kinds.NON_FIXED_INIT_TYPE_ARGUMENT,
                   processorContext.createMethodProcessingContext(method).createUniqueContext(),
                   appView)
               .getType();
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
index 91efed4..06ceb79 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
@@ -48,7 +48,7 @@
       consumer.accept(type);
       // Super and interfaces are live, no need to add them.
       if (!DexAnnotation.hasSynthesizedClassAnnotation(
-          clazz.annotations(), appView.dexItemFactory())) {
+          clazz.annotations(), appView.dexItemFactory(), appView.getSyntheticItems())) {
         traceAnnotationsDirectDependencies(clazz.annotations());
       }
       clazz.forEachField(field -> consumer.accept(field.getReference().type));
diff --git a/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java b/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
index ef9ae30..177fde7 100644
--- a/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
+++ b/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
@@ -107,7 +107,7 @@
       ImmutableSet<DexType> allSyntheticInputs =
           newSyntheticInputs == null ? parent.syntheticInputs : newSyntheticInputs.build();
       return new CommittedSyntheticsCollection(
-          allNonLegacyMethods, allNonLegacyClasses, allSyntheticInputs);
+          parent.naming, allNonLegacyMethods, allNonLegacyClasses, allSyntheticInputs);
     }
   }
 
@@ -122,8 +122,7 @@
     return ImmutableMap.copyOf(newSynthetics);
   }
 
-  private static final CommittedSyntheticsCollection EMPTY =
-      new CommittedSyntheticsCollection(ImmutableMap.of(), ImmutableMap.of(), ImmutableSet.of());
+  private final SyntheticNaming naming;
 
   /** Mapping from synthetic type to its synthetic method item description. */
   private final ImmutableMap<DexType, List<SyntheticMethodReference>> nonLegacyMethods;
@@ -135,15 +134,21 @@
   public final ImmutableSet<DexType> syntheticInputs;
 
   public CommittedSyntheticsCollection(
+      SyntheticNaming naming,
       ImmutableMap<DexType, List<SyntheticMethodReference>> nonLegacyMethods,
       ImmutableMap<DexType, List<SyntheticProgramClassReference>> nonLegacyClasses,
       ImmutableSet<DexType> syntheticInputs) {
+    this.naming = naming;
     this.nonLegacyMethods = nonLegacyMethods;
     this.nonLegacyClasses = nonLegacyClasses;
     this.syntheticInputs = syntheticInputs;
     assert verifySyntheticInputsSubsetOfSynthetics();
   }
 
+  SyntheticNaming getNaming() {
+    return naming;
+  }
+
   private boolean verifySyntheticInputsSubsetOfSynthetics() {
     Set<DexType> synthetics =
         ImmutableSet.<DexType>builder()
@@ -158,8 +163,9 @@
     return true;
   }
 
-  public static CommittedSyntheticsCollection empty() {
-    return EMPTY;
+  public static CommittedSyntheticsCollection empty(SyntheticNaming naming) {
+    return new CommittedSyntheticsCollection(
+        naming, ImmutableMap.of(), ImmutableMap.of(), ImmutableSet.of());
   }
 
   Builder builder() {
@@ -234,7 +240,7 @@
     if (removed.isEmpty()) {
       return this;
     }
-    Builder builder = CommittedSyntheticsCollection.empty().builder();
+    Builder builder = CommittedSyntheticsCollection.empty(naming).builder();
     boolean changed = false;
     for (SyntheticMethodReference reference : IterableUtils.flatten(nonLegacyMethods.values())) {
       if (removed.contains(reference.getHolder())) {
@@ -264,6 +270,7 @@
   CommittedSyntheticsCollection rewriteWithLens(NonIdentityGraphLens lens) {
     ImmutableSet.Builder<DexType> syntheticInputsBuilder = ImmutableSet.builder();
     return new CommittedSyntheticsCollection(
+        naming,
         rewriteItems(nonLegacyMethods, lens, syntheticInputsBuilder),
         rewriteItems(nonLegacyClasses, lens, syntheticInputsBuilder),
         syntheticInputsBuilder.build());
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index bcf892c..07f65be 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -270,7 +270,8 @@
         new CommittedItems(
             SyntheticItems.INVALID_ID_AFTER_SYNTHETIC_FINALIZATION,
             application,
-            new CommittedSyntheticsCollection(finalMethods, finalClasses, finalInputSynthetics),
+            new CommittedSyntheticsCollection(
+                synthetics.getNaming(), finalMethods, finalClasses, finalInputSynthetics),
             ImmutableList.of()),
         syntheticFinalizationGraphLens,
         PrunedItems.builder().setPrunedApp(application).addRemovedClasses(prunedSynthetics).build(),
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 887941c..48ff52a 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -55,9 +55,15 @@
 
   static final int INVALID_ID_AFTER_SYNTHETIC_FINALIZATION = -1;
 
+  private final SyntheticNaming naming;
+
   /** Globally incremented id for the next internal synthetic class. */
   private int nextSyntheticId;
 
+  public SyntheticNaming getNaming() {
+    return naming;
+  }
+
   /** Collection of pending items. */
   private static class PendingSynthetics {
 
@@ -100,13 +106,16 @@
 
   // Empty collection for use only in tests and utilities.
   public static SyntheticItems empty() {
-    return new SyntheticItems(-1, CommittedSyntheticsCollection.empty());
+    return new SyntheticItems(-1, CommittedSyntheticsCollection.empty(null));
   }
 
   // Only for use from initial AppInfo/AppInfoWithClassHierarchy create functions. */
   public static CommittedItems createInitialSyntheticItems(DexApplication application) {
     return new CommittedItems(
-        0, application, CommittedSyntheticsCollection.empty(), ImmutableList.of());
+        0,
+        application,
+        CommittedSyntheticsCollection.empty(application.dexItemFactory().getSyntheticNaming()),
+        ImmutableList.of());
   }
 
   // Only for conversion to a mutable synthetic items collection.
@@ -117,6 +126,7 @@
   private SyntheticItems(int nextSyntheticId, CommittedSyntheticsCollection committed) {
     this.nextSyntheticId = nextSyntheticId;
     this.committed = committed;
+    this.naming = committed.getNaming();
   }
 
   public static void collectSyntheticInputs(AppView<?> appView) {
@@ -245,11 +255,11 @@
     Iterable<SyntheticReference<?, ?, ?>> references = committed.getNonLegacyItems(clazz.getType());
     if (!Iterables.isEmpty(references)) {
       assert Iterables.size(references) == 1;
-      return references.iterator().next().getKind() == SyntheticKind.LAMBDA;
+      return references.iterator().next().getKind() == naming.LAMBDA;
     }
     SyntheticDefinition<?, ?, ?> definition = pending.nonLegacyDefinitions.get(clazz.getType());
     if (definition != null) {
-      return definition.getKind() == SyntheticKind.LAMBDA;
+      return definition.getKind() == naming.LAMBDA;
     }
     assert false;
     return false;
@@ -268,7 +278,8 @@
     return isSyntheticClass(clazz.type);
   }
 
-  public boolean isSyntheticOfKind(DexType type, SyntheticKind kind) {
+  public boolean isSyntheticOfKind(DexType type, SyntheticKindSelector kindSelector) {
+    SyntheticKind kind = kindSelector.select(naming);
     return pending.containsTypeOfKind(type, kind) || committed.containsTypeOfKind(type, kind);
   }
 
@@ -278,7 +289,7 @@
 
   public FeatureSplit getContextualFeatureSplit(
       DexType type, ClassToFeatureSplitMap classToFeatureSplitMap) {
-    if (isSyntheticOfKind(type, SyntheticKind.ENUM_UNBOXING_SHARED_UTILITY_CLASS)) {
+    if (isSyntheticOfKind(type, kinds -> kinds.ENUM_UNBOXING_SHARED_UTILITY_CLASS)) {
       // Use the startup base if there is one, such that we don't merge non-startup classes with the
       // shared utility class in case it is used during startup. The use of base startup allows for
       // merging startup classes with the shared utility class, however, which could be bad for
@@ -341,14 +352,14 @@
         committed
             .getNonLegacyMethods()
             .getOrDefault(method.getHolderType(), Collections.emptyList())) {
-      if (reference.getKind() == SyntheticKind.STATIC_INTERFACE_CALL) {
+      if (reference.getKind().equals(naming.STATIC_INTERFACE_CALL)) {
         return true;
       }
     }
     SyntheticDefinition<?, ?, ?> definition =
         pending.nonLegacyDefinitions.get(method.getHolderType());
     if (definition != null) {
-      return definition.getKind() == SyntheticKind.STATIC_INTERFACE_CALL;
+      return definition.getKind().equals(naming.STATIC_INTERFACE_CALL);
     }
     return false;
   }
@@ -364,7 +375,7 @@
     if (definition != null) {
       references = Iterables.concat(references, IterableUtils.singleton(definition.toReference()));
     }
-    if (Iterables.any(references, reference -> reference.getKind() == SyntheticKind.LAMBDA)) {
+    if (Iterables.any(references, reference -> reference.getKind().equals(naming.LAMBDA))) {
       assert ifIsLambda.test(clazz);
     } else {
       assert ifNotLambda.test(clazz);
@@ -489,15 +500,16 @@
   }
 
   public DexProgramClass createClass(
-      SyntheticKind kind, UniqueContext context, AppView<?> appView) {
-    return createClass(kind, context, appView, ConsumerUtils.emptyConsumer());
+      SyntheticKindSelector kindSelector, UniqueContext context, AppView<?> appView) {
+    return createClass(kindSelector, context, appView, ConsumerUtils.emptyConsumer());
   }
 
   public DexProgramClass createClass(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       UniqueContext context,
       AppView<?> appView,
       Consumer<SyntheticProgramClassBuilder> fn) {
+    SyntheticKind kind = kindSelector.select(naming);
     // Obtain the outer synthesizing context in the case the context itself is synthetic.
     // This is to ensure a flat input-type -> synthetic-item mapping.
     SynthesizingContext outerContext = getSynthesizingContext(context.getClassContext(), appView);
@@ -511,10 +523,11 @@
 
   // TODO(b/172194101): Make this take a unique context.
   public DexProgramClass createFixedClass(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       DexProgramClass context,
       AppView<?> appView,
       Consumer<SyntheticProgramClassBuilder> fn) {
+    SyntheticKind kind = kindSelector.select(naming);
     SynthesizingContext outerContext = internalGetOuterContext(context, appView);
     Function<SynthesizingContext, DexType> contextToType =
         c -> SyntheticNaming.createFixedType(kind, c, appView.dexItemFactory());
@@ -523,7 +536,8 @@
   }
 
   public DexProgramClass getExistingFixedClass(
-      SyntheticKind kind, DexClass context, AppView<?> appView) {
+      SyntheticKindSelector kindSelector, DexClass context, AppView<?> appView) {
+    SyntheticKind kind = kindSelector.select(naming);
     assert kind.isFixedSuffixSynthetic();
     SynthesizingContext outerContext = internalGetOuterContext(context, appView);
     DexType type = SyntheticNaming.createFixedType(kind, outerContext, appView.dexItemFactory());
@@ -542,17 +556,23 @@
         : SynthesizingContext.fromNonSyntheticInputContext(context.asClasspathOrLibraryClass());
   }
 
+  @FunctionalInterface
+  public interface SyntheticKindSelector {
+    SyntheticKind select(SyntheticNaming naming);
+  }
+
   /**
    * Ensure that a fixed synthetic class exists.
    *
    * <p>This method is thread safe and will synchronize based on the context of the fixed synthetic.
    */
   public DexProgramClass ensureFixedClass(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       DexClass context,
       AppView<?> appView,
       Consumer<SyntheticProgramClassBuilder> fn,
       Consumer<DexProgramClass> onCreationConsumer) {
+    SyntheticKind kind = kindSelector.select(naming);
     assert kind.isFixedSuffixSynthetic();
     SynthesizingContext outerContext = internalGetOuterContext(context, appView);
     return internalEnsureFixedProgramClass(kind, fn, onCreationConsumer, outerContext, appView);
@@ -561,7 +581,7 @@
   public ProgramMethod ensureFixedClassMethod(
       DexString name,
       DexProto proto,
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       ProgramDefinition context,
       AppView<?> appView,
       Consumer<SyntheticProgramClassBuilder> buildClassCallback,
@@ -569,7 +589,7 @@
     return ensureFixedClassMethod(
         name,
         proto,
-        kind,
+        kindSelector,
         context,
         appView,
         buildClassCallback,
@@ -580,15 +600,16 @@
   public ProgramMethod ensureFixedClassMethod(
       DexString name,
       DexProto proto,
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       ProgramDefinition context,
       AppView<?> appView,
       Consumer<SyntheticProgramClassBuilder> buildClassCallback,
       Consumer<SyntheticMethodBuilder> buildMethodCallback,
       Consumer<ProgramMethod> newMethodCallback) {
+    SyntheticKind kind = kindSelector.select(naming);
     DexProgramClass clazz =
         ensureFixedClass(
-            kind, context.getContextClass(), appView, buildClassCallback, emptyConsumer());
+            kindSelector, context.getContextClass(), appView, buildClassCallback, emptyConsumer());
     DexMethod methodReference = appView.dexItemFactory().createMethod(clazz.getType(), proto, name);
     DexEncodedMethod methodDefinition =
         internalEnsureMethod(
@@ -642,18 +663,19 @@
   }
 
   public DexClasspathClass ensureFixedClasspathClassFromType(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       DexType contextType,
       AppView<?> appView,
       Consumer<SyntheticClasspathClassBuilder> classConsumer,
       Consumer<DexClasspathClass> onCreationConsumer) {
+    SyntheticKind kind = kindSelector.select(naming);
     SynthesizingContext outerContext = SynthesizingContext.fromType(contextType);
     return internalEnsureFixedClasspathClass(
         kind, classConsumer, onCreationConsumer, outerContext, appView);
   }
 
   public DexClasspathClass ensureFixedClasspathClass(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       ClasspathOrLibraryClass context,
       AppView<?> appView,
       Consumer<SyntheticClasspathClassBuilder> classConsumer,
@@ -662,13 +684,13 @@
     // This is to ensure a flat input-type -> synthetic-item mapping.
     SynthesizingContext outerContext = SynthesizingContext.fromNonSyntheticInputContext(context);
     return internalEnsureFixedClasspathClass(
-        kind, classConsumer, onCreationConsumer, outerContext, appView);
+        kindSelector.select(naming), classConsumer, onCreationConsumer, outerContext, appView);
   }
 
   public ClasspathMethod ensureFixedClasspathMethodFromType(
       DexString methodName,
       DexProto methodProto,
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       DexType contextType,
       AppView<?> appView,
       Consumer<SyntheticClasspathClassBuilder> classConsumer,
@@ -676,15 +698,15 @@
       Consumer<SyntheticMethodBuilder> buildMethodCallback) {
     DexClasspathClass clazz =
         ensureFixedClasspathClassFromType(
-            kind, contextType, appView, classConsumer, onCreationConsumer);
+            kindSelector, contextType, appView, classConsumer, onCreationConsumer);
     return internalEnsureFixedClasspathMethod(
-        methodName, methodProto, kind, appView, buildMethodCallback, clazz);
+        methodName, methodProto, kindSelector.select(naming), appView, buildMethodCallback, clazz);
   }
 
   public ClasspathMethod ensureFixedClasspathClassMethod(
       DexString methodName,
       DexProto methodProto,
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       ClasspathOrLibraryClass context,
       AppView<?> appView,
       Consumer<SyntheticClasspathClassBuilder> buildClassCallback,
@@ -692,9 +714,9 @@
       Consumer<SyntheticMethodBuilder> buildMethodCallback) {
     DexClasspathClass clazz =
         ensureFixedClasspathClass(
-            kind, context, appView, buildClassCallback, onClassCreationCallback);
+            kindSelector, context, appView, buildClassCallback, onClassCreationCallback);
     return internalEnsureFixedClasspathMethod(
-        methodName, methodProto, kind, appView, buildMethodCallback, clazz);
+        methodName, methodProto, kindSelector.select(naming), appView, buildMethodCallback, clazz);
   }
 
   private ClasspathMethod internalEnsureFixedClasspathMethod(
@@ -748,26 +770,28 @@
   }
 
   public DexProgramClass ensureFixedClassFromType(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       DexType contextType,
       AppView<?> appView,
       Consumer<SyntheticProgramClassBuilder> fn,
       Consumer<DexProgramClass> onCreationConsumer) {
+    SyntheticKind kind = kindSelector.select(naming);
     SynthesizingContext outerContext = SynthesizingContext.fromType(contextType);
     return internalEnsureFixedProgramClass(kind, fn, onCreationConsumer, outerContext, appView);
   }
 
   /** Create a single synthetic method item. */
   public ProgramMethod createMethod(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       UniqueContext context,
       AppView<?> appView,
       Consumer<SyntheticMethodBuilder> fn) {
-    return createMethod(kind, context.getClassContext(), appView, fn, context::getSyntheticSuffix);
+    return createMethod(
+        kindSelector, context.getClassContext(), appView, fn, context::getSyntheticSuffix);
   }
 
   private ProgramMethod createMethod(
-      SyntheticKind kind,
+      SyntheticKindSelector kindSelector,
       ProgramDefinition context,
       AppView<?> appView,
       Consumer<SyntheticMethodBuilder> fn,
@@ -776,6 +800,7 @@
     // Obtain the outer synthesizing context in the case the context itself is synthetic.
     // This is to ensure a flat input-type -> synthetic-item mapping.
     SynthesizingContext outerContext = getSynthesizingContext(context, appView);
+    SyntheticKind kind = kindSelector.select(naming);
     DexType type =
         SyntheticNaming.createInternalType(
             kind, outerContext, syntheticIdSupplier.get(), appView.dexItemFactory());
@@ -868,7 +893,7 @@
       // single kind of a synthetic which is required for marking synthetics. This check could be
       // relaxed to ensure that all kinds are equivalent if merging is possible.
       assert !it.hasNext();
-      SyntheticMarker.writeMarkerAttribute(writer, kind);
+      SyntheticMarker.writeMarkerAttribute(writer, kind, appView.getSyntheticItems());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
index 728947e..c21954b 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
@@ -25,12 +25,13 @@
   private static final String SYNTHETIC_MARKER_ATTRIBUTE_TYPE_NAME =
       "com.android.tools.r8.SynthesizedClass";
 
-  public static Attribute getMarkerAttributePrototype() {
-    return MarkerAttribute.PROTOTYPE;
+  public static Attribute getMarkerAttributePrototype(SyntheticNaming syntheticNaming) {
+    return new MarkerAttribute(null, syntheticNaming);
   }
 
-  public static void writeMarkerAttribute(ClassWriter writer, SyntheticKind kind) {
-    writer.visitAttribute(new MarkerAttribute(kind));
+  public static void writeMarkerAttribute(
+      ClassWriter writer, SyntheticKind kind, SyntheticItems syntheticItems) {
+    writer.visitAttribute(new MarkerAttribute(kind, syntheticItems.getNaming()));
   }
 
   public static SyntheticMarker readMarkerAttribute(Attribute attribute) {
@@ -43,13 +44,13 @@
 
   private static class MarkerAttribute extends Attribute {
 
-    private static final MarkerAttribute PROTOTYPE = new MarkerAttribute(null);
-
     private SyntheticKind kind;
+    private final SyntheticNaming syntheticNaming;
 
-    public MarkerAttribute(SyntheticKind kind) {
+    public MarkerAttribute(SyntheticKind kind, SyntheticNaming syntheticNaming) {
       super(SYNTHETIC_MARKER_ATTRIBUTE_TYPE_NAME);
       this.kind = kind;
+      this.syntheticNaming = syntheticNaming;
     }
 
     @Override
@@ -62,8 +63,8 @@
         Label[] labels) {
       short id = classReader.readShort(offset);
       assert id >= 0;
-      SyntheticKind kind = SyntheticKind.fromId(id);
-      return new MarkerAttribute(kind);
+      SyntheticKind kind = syntheticNaming.fromId(id);
+      return new MarkerAttribute(kind, syntheticNaming);
     }
 
     @Override
@@ -103,7 +104,7 @@
     SyntheticMarker marker = internalStripMarkerFromClass(clazz, appView);
     assert marker != NO_MARKER
         || !DexAnnotation.hasSynthesizedClassAnnotation(
-            clazz.annotations(), appView.dexItemFactory());
+            clazz.annotations(), appView.dexItemFactory(), appView.getSyntheticItems());
     return marker;
   }
 
@@ -117,7 +118,7 @@
     }
     SyntheticKind kind =
         DexAnnotation.getSynthesizedClassAnnotationInfo(
-            clazz.annotations(), appView.dexItemFactory());
+            clazz.annotations(), appView.dexItemFactory(), appView.getSyntheticItems());
     if (kind == null) {
       return NO_MARKER;
     }
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index 0e80d65..e95c6a1 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -17,6 +18,83 @@
 
 public class SyntheticNaming {
 
+  public SyntheticNaming() {}
+
+  private KindGenerator generator = new KindGenerator();
+
+  // Global synthetics.
+  public final SyntheticKind RECORD_TAG = generator.forGlobalClass();
+  public final SyntheticKind API_MODEL_STUB = generator.forGlobalClass();
+
+  // Classpath only synthetics in the global type namespace.
+  public final SyntheticKind RETARGET_STUB = generator.forGlobalClasspathClass();
+  public final SyntheticKind EMULATED_INTERFACE_MARKER_CLASS = generator.forGlobalClasspathClass();
+
+  // Fixed suffix synthetics. Each has a hygienic prefix type.
+  public final SyntheticKind ENUM_UNBOXING_LOCAL_UTILITY_CLASS =
+      generator.forFixedClass("$EnumUnboxingLocalUtility");
+  public final SyntheticKind ENUM_UNBOXING_SHARED_UTILITY_CLASS =
+      generator.forFixedClass("$EnumUnboxingSharedUtility");
+  public final SyntheticKind COMPANION_CLASS = generator.forFixedClass("$-CC");
+  public final SyntheticKind EMULATED_INTERFACE_CLASS =
+      generator.forFixedClass(InterfaceDesugaringForTesting.EMULATED_INTERFACE_CLASS_SUFFIX);
+  public final SyntheticKind RETARGET_CLASS = generator.forFixedClass("RetargetClass");
+  public final SyntheticKind RETARGET_INTERFACE = generator.forFixedClass("RetargetInterface");
+  public final SyntheticKind WRAPPER = generator.forFixedClass("$Wrapper");
+  public final SyntheticKind VIVIFIED_WRAPPER = generator.forFixedClass("$VivifiedWrapper");
+  public final SyntheticKind INIT_TYPE_ARGUMENT = generator.forFixedClass("-IA");
+  public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_1 =
+      generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$1");
+  public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_2 =
+      generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$2");
+  public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_3 =
+      generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$3");
+  public final SyntheticKind ENUM_CONVERSION = generator.forFixedClass("$EnumConversion");
+
+  // Locally generated synthetic classes.
+  public final SyntheticKind LAMBDA = generator.forInstanceClass("Lambda");
+
+  // TODO(b/214901256): Sharing of synthetic classes may lead to duplicate method errors.
+  public final SyntheticKind NON_FIXED_INIT_TYPE_ARGUMENT =
+      generator.forNonSharableInstanceClass("$IA");
+  public final SyntheticKind CONST_DYNAMIC = generator.forInstanceClass("$Condy");
+
+  // Method synthetics.
+  public final SyntheticKind ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD =
+      generator.forSingleMethod("CheckNotZero");
+  public final SyntheticKind RECORD_HELPER = generator.forSingleMethod("Record");
+  public final SyntheticKind BACKPORT = generator.forSingleMethod("Backport");
+  public final SyntheticKind BACKPORT_WITH_FORWARDING =
+      generator.forSingleMethod("BackportWithForwarding");
+  public final SyntheticKind STATIC_INTERFACE_CALL =
+      generator.forSingleMethod("StaticInterfaceCall");
+  public final SyntheticKind TO_STRING_IF_NOT_NULL = generator.forSingleMethod("ToStringIfNotNull");
+  public final SyntheticKind THROW_CCE_IF_NOT_NULL = generator.forSingleMethod("ThrowCCEIfNotNull");
+  public final SyntheticKind THROW_IAE = generator.forSingleMethod("ThrowIAE");
+  public final SyntheticKind THROW_ICCE = generator.forSingleMethod("ThrowICCE");
+  public final SyntheticKind THROW_NSME = generator.forSingleMethod("ThrowNSME");
+  public final SyntheticKind TWR_CLOSE_RESOURCE = generator.forSingleMethod("TwrCloseResource");
+  public final SyntheticKind SERVICE_LOADER = generator.forSingleMethod("ServiceLoad");
+  public final SyntheticKind OUTLINE = generator.forSingleMethod("Outline");
+  public final SyntheticKind API_CONVERSION = generator.forSingleMethod("APIConversion");
+  public final SyntheticKind API_CONVERSION_PARAMETERS =
+      generator.forSingleMethod("APIConversionParameters");
+  public final SyntheticKind ARRAY_CONVERSION = generator.forSingleMethod("$ArrayConversion");
+  public final SyntheticKind API_MODEL_OUTLINE = generator.forSingleMethod("ApiModelOutline");
+
+  private final List<SyntheticKind> ALL_KINDS = generator.getAllKinds();
+
+  public Collection<SyntheticKind> kinds() {
+    return ALL_KINDS;
+  }
+
+  public SyntheticKind fromId(int id) {
+    if (0 < id && id <= ALL_KINDS.size()) {
+      return ALL_KINDS.get(id - 1);
+    }
+    return null;
+  }
+
   private static class KindGenerator {
     private int nextId = 1;
     private List<SyntheticKind> kinds = new ArrayList<>();
@@ -34,8 +112,13 @@
       return register(new SyntheticMethodKind(getNextId(), descriptor));
     }
 
+    // TODO(b/214901256): Remove once fixed.
+    SyntheticKind forNonSharableInstanceClass(String descriptor) {
+      return register(new SyntheticClassKind(getNextId(), descriptor, false));
+    }
+
     SyntheticKind forInstanceClass(String descriptor) {
-      return register(new SyntheticClassKind(getNextId(), descriptor));
+      return register(new SyntheticClassKind(getNextId(), descriptor, true));
     }
 
     SyntheticKind forFixedClass(String descriptor) {
@@ -68,98 +151,6 @@
    */
   public abstract static class SyntheticKind implements Ordered<SyntheticKind> {
 
-    public static final SyntheticKind ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
-        ENUM_UNBOXING_SHARED_UTILITY_CLASS,
-        RECORD_TAG,
-        COMPANION_CLASS,
-        EMULATED_INTERFACE_CLASS,
-        RETARGET_CLASS,
-        RETARGET_STUB,
-        RETARGET_INTERFACE,
-        WRAPPER,
-        VIVIFIED_WRAPPER,
-        LAMBDA,
-        INIT_TYPE_ARGUMENT,
-        HORIZONTAL_INIT_TYPE_ARGUMENT_1,
-        HORIZONTAL_INIT_TYPE_ARGUMENT_2,
-        HORIZONTAL_INIT_TYPE_ARGUMENT_3,
-        NON_FIXED_INIT_TYPE_ARGUMENT,
-        ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD,
-        RECORD_HELPER,
-        BACKPORT,
-        BACKPORT_WITH_FORWARDING,
-        STATIC_INTERFACE_CALL,
-        TO_STRING_IF_NOT_NULL,
-        THROW_CCE_IF_NOT_NULL,
-        THROW_IAE,
-        THROW_ICCE,
-        THROW_NSME,
-        TWR_CLOSE_RESOURCE,
-        SERVICE_LOADER,
-        OUTLINE,
-        API_CONVERSION,
-        API_CONVERSION_PARAMETERS,
-        EMULATED_INTERFACE_MARKER_CLASS,
-        CONST_DYNAMIC,
-        ENUM_CONVERSION,
-        ARRAY_CONVERSION,
-        API_MODEL_OUTLINE,
-        API_MODEL_STUB;
-
-    private static final List<SyntheticKind> ALL_KINDS;
-
-    static {
-      KindGenerator generator = new KindGenerator();
-      // Global synthetics.
-      RECORD_TAG = generator.forGlobalClass();
-      API_MODEL_STUB = generator.forGlobalClass();
-
-      // Classpath only synthetics in the global type namespace.
-      RETARGET_STUB = generator.forGlobalClasspathClass();
-      EMULATED_INTERFACE_MARKER_CLASS = generator.forGlobalClasspathClass();
-
-      // Fixed suffix synthetics. Each has a hygienic prefix type.
-      ENUM_UNBOXING_LOCAL_UTILITY_CLASS = generator.forFixedClass("$EnumUnboxingLocalUtility");
-      ENUM_UNBOXING_SHARED_UTILITY_CLASS = generator.forFixedClass("$EnumUnboxingSharedUtility");
-      COMPANION_CLASS = generator.forFixedClass("$-CC");
-      EMULATED_INTERFACE_CLASS = generator.forFixedClass("$-EL");
-      RETARGET_CLASS = generator.forFixedClass("RetargetClass");
-      RETARGET_INTERFACE = generator.forFixedClass("RetargetInterface");
-      WRAPPER = generator.forFixedClass("$Wrapper");
-      VIVIFIED_WRAPPER = generator.forFixedClass("$VivifiedWrapper");
-      INIT_TYPE_ARGUMENT = generator.forFixedClass("-IA");
-      HORIZONTAL_INIT_TYPE_ARGUMENT_1 = generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$1");
-      HORIZONTAL_INIT_TYPE_ARGUMENT_2 = generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$2");
-      HORIZONTAL_INIT_TYPE_ARGUMENT_3 = generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$3");
-      ENUM_CONVERSION = generator.forFixedClass("$EnumConversion");
-
-      // Locally generated synthetic classes.
-      LAMBDA = generator.forInstanceClass("Lambda");
-      NON_FIXED_INIT_TYPE_ARGUMENT = generator.forInstanceClass("$IA");
-      CONST_DYNAMIC = generator.forInstanceClass("$Condy");
-
-      // Method synthetics.
-      ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD = generator.forSingleMethod("CheckNotZero");
-      RECORD_HELPER = generator.forSingleMethod("Record");
-      BACKPORT = generator.forSingleMethod("Backport");
-      BACKPORT_WITH_FORWARDING = generator.forSingleMethod("BackportWithForwarding");
-      STATIC_INTERFACE_CALL = generator.forSingleMethod("StaticInterfaceCall");
-      TO_STRING_IF_NOT_NULL = generator.forSingleMethod("ToStringIfNotNull");
-      THROW_CCE_IF_NOT_NULL = generator.forSingleMethod("ThrowCCEIfNotNull");
-      THROW_IAE = generator.forSingleMethod("ThrowIAE");
-      THROW_ICCE = generator.forSingleMethod("ThrowICCE");
-      THROW_NSME = generator.forSingleMethod("ThrowNSME");
-      TWR_CLOSE_RESOURCE = generator.forSingleMethod("TwrCloseResource");
-      SERVICE_LOADER = generator.forSingleMethod("ServiceLoad");
-      OUTLINE = generator.forSingleMethod("Outline");
-      API_CONVERSION = generator.forSingleMethod("APIConversion");
-      API_CONVERSION_PARAMETERS = generator.forSingleMethod("APIConversionParameters");
-      ARRAY_CONVERSION = generator.forSingleMethod("$ArrayConversion");
-      API_MODEL_OUTLINE = generator.forSingleMethod("ApiModelOutline");
-
-      ALL_KINDS = generator.getAllKinds();
-    }
-
     private final int id;
     private final String descriptor;
 
@@ -183,18 +174,6 @@
       return Equatable.equalsImpl(this, o);
     }
 
-    public static Collection<SyntheticKind> values() {
-      return ALL_KINDS;
-    }
-
-    public static SyntheticKind fromId(int id) {
-      if (0 < id && id <= ALL_KINDS.size()) {
-        return ALL_KINDS.get(id - 1);
-      }
-      assert false;
-      return null;
-    }
-
     public int getId() {
       return id;
     }
@@ -256,17 +235,17 @@
 
   private static class SyntheticClassKind extends SyntheticKind {
 
-    public SyntheticClassKind(int id, String descriptor) {
+    // TODO(b/214901256): Remove once fixed.
+    private final boolean sharable;
+
+    public SyntheticClassKind(int id, String descriptor, boolean sharable) {
       super(id, descriptor);
+      this.sharable = sharable;
     }
 
     @Override
     public boolean isShareable() {
-      if (this == NON_FIXED_INIT_TYPE_ARGUMENT) {
-        // TODO(b/214901256): Sharing of synthetic classes may lead to duplicate method errors.
-        return false;
-      }
-      return true;
+      return sharable;
     }
 
     @Override
@@ -304,7 +283,7 @@
         String descriptor,
         boolean mayOverridesNonProgramType,
         boolean allowSyntheticContext) {
-      super(id, descriptor);
+      super(id, descriptor, false);
       this.mayOverridesNonProgramType = mayOverridesNonProgramType;
       this.allowSyntheticContext = allowSyntheticContext;
     }
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 18fb93b..b53f301 100644
--- a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
+++ b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
@@ -16,6 +16,10 @@
 
 public class SyntheticItemsTestUtils {
 
+  // Private copy of the synthetic namings. This is not the compiler instance, but checking on the
+  // id/descriptor content is safe.
+  private static final SyntheticNaming naming = new SyntheticNaming();
+
   public static String syntheticMethodName() {
     return SyntheticNaming.INTERNAL_SYNTHETIC_METHOD_NAME;
   }
@@ -38,8 +42,7 @@
   }
 
   public static MethodReference syntheticBackportMethod(Class<?> clazz, int id, Method method) {
-    ClassReference syntheticHolder =
-        syntheticClass(clazz, SyntheticNaming.SyntheticKind.BACKPORT, id);
+    ClassReference syntheticHolder = syntheticClass(clazz, naming.BACKPORT, id);
     MethodReference originalMethod = Reference.methodFromMethod(method);
     return Reference.methodFromDescriptor(
         syntheticHolder.getDescriptor(),
@@ -48,15 +51,15 @@
   }
 
   public static ClassReference syntheticOutlineClass(Class<?> clazz, int id) {
-    return syntheticClass(clazz, SyntheticKind.OUTLINE, id);
+    return syntheticClass(clazz, naming.OUTLINE, id);
   }
 
   public static ClassReference syntheticOutlineClass(ClassReference clazz, int id) {
-    return syntheticClass(clazz, SyntheticKind.OUTLINE, id);
+    return syntheticClass(clazz, naming.OUTLINE, id);
   }
 
   public static ClassReference syntheticLambdaClass(Class<?> clazz, int id) {
-    return syntheticClass(clazz, SyntheticNaming.SyntheticKind.LAMBDA, id);
+    return syntheticClass(clazz, naming.LAMBDA, id);
   }
 
   public static MethodReference syntheticLambdaMethod(Class<?> clazz, int id, Method method) {
@@ -69,12 +72,11 @@
   }
 
   public static boolean isEnumUnboxingSharedUtilityClass(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(
-        reference, null, SyntheticKind.ENUM_UNBOXING_SHARED_UTILITY_CLASS);
+    return SyntheticNaming.isSynthetic(reference, null, naming.ENUM_UNBOXING_SHARED_UTILITY_CLASS);
   }
 
   public static boolean isExternalSynthetic(ClassReference reference) {
-    for (SyntheticKind kind : SyntheticKind.values()) {
+    for (SyntheticKind kind : naming.kinds()) {
       if (kind.isGlobal()) {
         continue;
       }
@@ -92,52 +94,48 @@
   }
 
   public static boolean isInternalLambda(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(reference, Phase.INTERNAL, SyntheticKind.LAMBDA);
+    return SyntheticNaming.isSynthetic(reference, Phase.INTERNAL, naming.LAMBDA);
   }
 
   public static boolean isExternalLambda(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, SyntheticKind.LAMBDA);
+    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.LAMBDA);
   }
 
   public static boolean isExternalStaticInterfaceCall(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(
-        reference, Phase.EXTERNAL, SyntheticKind.STATIC_INTERFACE_CALL);
+    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.STATIC_INTERFACE_CALL);
   }
 
   public static boolean isExternalTwrCloseMethod(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, SyntheticKind.TWR_CLOSE_RESOURCE);
+    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.TWR_CLOSE_RESOURCE);
   }
 
   public static boolean isMaybeExternalSuppressedExceptionMethod(ClassReference reference) {
     // The suppressed exception methods are grouped with the backports.
-    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, SyntheticKind.BACKPORT);
+    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.BACKPORT);
   }
 
   public static boolean isExternalOutlineClass(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, SyntheticKind.OUTLINE);
+    return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.OUTLINE);
   }
 
   public static boolean isInitializerTypeArgument(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(reference, null, SyntheticKind.INIT_TYPE_ARGUMENT);
+    return SyntheticNaming.isSynthetic(reference, null, naming.INIT_TYPE_ARGUMENT);
   }
 
   public static boolean isExternalNonFixedInitializerTypeArgument(ClassReference reference) {
     return SyntheticNaming.isSynthetic(
-        reference, Phase.EXTERNAL, SyntheticKind.NON_FIXED_INIT_TYPE_ARGUMENT);
+        reference, Phase.EXTERNAL, naming.NON_FIXED_INIT_TYPE_ARGUMENT);
   }
 
   public static boolean isHorizontalInitializerTypeArgument(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(
-            reference, null, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_1)
-        || SyntheticNaming.isSynthetic(
-            reference, null, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_2)
-        || SyntheticNaming.isSynthetic(
-            reference, null, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_3);
+    return SyntheticNaming.isSynthetic(reference, null, naming.HORIZONTAL_INIT_TYPE_ARGUMENT_1)
+        || SyntheticNaming.isSynthetic(reference, null, naming.HORIZONTAL_INIT_TYPE_ARGUMENT_2)
+        || SyntheticNaming.isSynthetic(reference, null, naming.HORIZONTAL_INIT_TYPE_ARGUMENT_3);
   }
 
   public static boolean isWrapper(ClassReference reference) {
-    return SyntheticNaming.isSynthetic(reference, null, SyntheticKind.WRAPPER)
-        || SyntheticNaming.isSynthetic(reference, null, SyntheticKind.VIVIFIED_WRAPPER);
+    return SyntheticNaming.isSynthetic(reference, null, naming.WRAPPER)
+        || SyntheticNaming.isSynthetic(reference, null, naming.VIVIFIED_WRAPPER);
   }
 
   public static Matcher<String> containsInternalSyntheticReference() {
@@ -149,7 +147,6 @@
   }
 
   public static boolean isInternalThrowNSME(MethodReference method) {
-    return SyntheticNaming.isSynthetic(
-        method.getHolderClass(), Phase.INTERNAL, SyntheticKind.THROW_NSME);
+    return SyntheticNaming.isSynthetic(method.getHolderClass(), Phase.INTERNAL, naming.THROW_NSME);
   }
 }