Prune the library and classpath collections after tree shaking.

Bug: 139464956
Change-Id: I31214f2240247a42d97555a8f04f0278974ffcab
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 5e47207..a647cf5 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -52,6 +52,8 @@
           AppView.createForR8(new AppInfoWithSubtyping(application), options);
       appView.setAppServices(AppServices.builder(appView).build());
 
+      MainDexListBuilder.checkForAssumedLibraryTypes(appView.appInfo());
+
       RootSet mainDexRootSet =
           new RootSetBuilder(appView, application, options.mainDexKeepRules).run(executor);
 
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 78471d6..9d3e2a3 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -31,6 +31,7 @@
 import com.android.tools.r8.graph.analysis.InitializedClassesInInstanceMethodsAnalysis;
 import com.android.tools.r8.ir.analysis.proto.GeneratedExtensionRegistryShrinker;
 import com.android.tools.r8.ir.conversion.IRConverter;
+import com.android.tools.r8.ir.desugar.BackportedMethodRewriter;
 import com.android.tools.r8.ir.desugar.NestedPrivateMethodLense;
 import com.android.tools.r8.ir.desugar.R8NestBasedAccessDesugaring;
 import com.android.tools.r8.ir.optimize.AssertionsRewriter;
@@ -270,6 +271,14 @@
           AppView.createForR8(new AppInfoWithSubtyping(application), options);
       appView.setAppServices(AppServices.builder(appView).build());
 
+      // Up-front check for valid library setup.
+      if (!options.mainDexKeepRules.isEmpty()) {
+        MainDexListBuilder.checkForAssumedLibraryTypes(appView.appInfo());
+      }
+      if (!options.desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()) {
+        BackportedMethodRewriter.checkForAssumedLibraryTypes(appView);
+      }
+
       List<ProguardConfigurationRule> synthesizedProguardRules = new ArrayList<>();
       timing.begin("Strip unused code");
       Set<DexType> classesToRetainInnerClassAttributeFor = null;
diff --git a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
index 94633a0..93ee213 100644
--- a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
@@ -57,6 +57,7 @@
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.StringUtils.BraceType;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import it.unimi.dsi.fastutil.objects.Reference2IntMap;
 import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap;
 import java.util.ArrayList;
@@ -64,6 +65,7 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -224,8 +226,42 @@
     return "options.itemFactory.createString(" + quote(string.toString()) + ")";
   }
 
+  private final Map<String, String> knownTypeFields =
+      ImmutableMap.<String, String>builder()
+          .put("Z", "booleanType")
+          .put("B", "byteType")
+          .put("C", "charType")
+          .put("D", "doubleType")
+          .put("F", "floatType")
+          .put("I", "intType")
+          .put("J", "longType")
+          .put("S", "shortType")
+          .put("V", "voidType")
+          .put("[Z", "booleanArrayType")
+          .put("[B", "byteArrayType")
+          .put("[C", "charArrayType")
+          .put("[D", "doubleArrayType")
+          .put("[F", "floatArrayType")
+          .put("[I", "intArrayType")
+          .put("[J", "longArrayType")
+          .put("[S", "shortArrayType")
+          .put("Ljava/lang/Object;", "objectType")
+          .put("Ljava/lang/Class;", "classType")
+          .put("Ljava/lang/Throwable;", "throwableType")
+          .put("Ljava/lang/String;", "stringType")
+          .put("Ljava/lang/Character;", "boxedCharType")
+          .put("Ljava/lang/CharSequence;", "charSequenceType")
+          .put("Ljava/lang/StringBuilder;", "stringBuilderType")
+          .put("Ljava/lang/AutoCloseable;", "autoCloseableType")
+          .build();
+
   private String dexType(DexType type) {
-    return "options.itemFactory.createType(" + quote(type.toDescriptorString()) + ")";
+    String descriptor = type.toDescriptorString();
+    String field = knownTypeFields.get(descriptor);
+    if (field != null) {
+      return "options.itemFactory." + field;
+    }
+    return "options.itemFactory.createSynthesizedType(" + quote(descriptor) + ")";
   }
 
   private String dexProto(DexProto proto) {
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 993363c..6013392 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -246,7 +246,14 @@
       if (options.encodeChecksums) {
         encodeChecksums(virtualFiles);
       }
+      // TODO(b/149190785): Only sort the live program!
+      if (appView != null) {
+        appView.appInfo().disableDefinitionForAssert();
+      }
       application.dexItemFactory.sort(namingLens);
+      if (appView != null) {
+        appView.appInfo().enableDefinitionForAssert();
+      }
       assert markers == null
           || markers.isEmpty()
           || application.dexItemFactory.extractMarkers() != null;
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfo.java b/src/main/java/com/android/tools/r8/graph/AppInfo.java
index 03f0231..feb71dc 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -673,4 +673,9 @@
     }
   }
 
+  // TODO(b/149190785): Remove once fixed.
+  public void enableDefinitionForAssert() {}
+
+  // TODO(b/149190785): Remove once fixed.
+  public void disableDefinitionForAssert() {}
 }
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 7af203c..d6dd805 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -821,8 +821,8 @@
     DexProto proto = itemFactory.createProto(itemFactory.intType, args);
     DexMethod logMethod =
         itemFactory.createMethod(
-            itemFactory.createType("Landroid/util/Log;"), proto, itemFactory.createString("e"));
-    DexType exceptionType = itemFactory.createType("Ljava/lang/RuntimeException;");
+            itemFactory.androidUtilLogType, proto, itemFactory.createString("e"));
+    DexType exceptionType = itemFactory.runtimeExceptionType;
     DexMethod exceptionInitMethod =
         itemFactory.createMethod(
             exceptionType,
@@ -851,7 +851,7 @@
         itemFactory.createString(
             CONFIGURATION_DEBUGGING_PREFIX + method.holder.toSourceString() + ": " + signature);
     DexString tag = itemFactory.createString("[R8]");
-    DexType logger = itemFactory.createType("Ljava/util/logging/Logger;");
+    DexType logger = itemFactory.javaUtilLoggingLoggerType;
     DexMethod getLogger =
         itemFactory.createMethod(
             logger,
@@ -862,7 +862,7 @@
             logger,
             itemFactory.createProto(itemFactory.voidType, itemFactory.stringType),
             itemFactory.createString("severe"));
-    DexType exceptionType = itemFactory.createType("Ljava/lang/RuntimeException;");
+    DexType exceptionType = itemFactory.runtimeExceptionType;
     DexMethod exceptionInitMethod =
         itemFactory.createMethod(
             exceptionType,
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 c38f7c6..df2402f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -37,6 +37,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 import com.google.common.collect.Streams;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceArrayMap;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
@@ -61,6 +62,9 @@
 
   public static final String throwableDescriptorString = "Ljava/lang/Throwable;";
 
+  /** Set of types that may be synthesized during compilation. */
+  private final Set<DexType> possibleCompilerSynthesizedTypes = Sets.newIdentityHashSet();
+
   private final Map<DexString, DexString> strings = new ConcurrentHashMap<>();
   private final Map<DexString, DexType> types = new ConcurrentHashMap<>();
   private final Map<DexField, DexField> fields = new ConcurrentHashMap<>();
@@ -281,96 +285,120 @@
 
   public final DexString throwableArrayDescriptor = createString("[Ljava/lang/Throwable;");
 
-  public final DexType booleanType = createType(booleanDescriptor);
-  public final DexType byteType = createType(byteDescriptor);
-  public final DexType charType = createType(charDescriptor);
-  public final DexType doubleType = createType(doubleDescriptor);
-  public final DexType floatType = createType(floatDescriptor);
-  public final DexType intType = createType(intDescriptor);
-  public final DexType longType = createType(longDescriptor);
-  public final DexType shortType = createType(shortDescriptor);
-  public final DexType voidType = createType(voidDescriptor);
+  public final DexType booleanType = createStaticallyKnownType(booleanDescriptor);
+  public final DexType byteType = createStaticallyKnownType(byteDescriptor);
+  public final DexType charType = createStaticallyKnownType(charDescriptor);
+  public final DexType doubleType = createStaticallyKnownType(doubleDescriptor);
+  public final DexType floatType = createStaticallyKnownType(floatDescriptor);
+  public final DexType intType = createStaticallyKnownType(intDescriptor);
+  public final DexType longType = createStaticallyKnownType(longDescriptor);
+  public final DexType shortType = createStaticallyKnownType(shortDescriptor);
+  public final DexType voidType = createStaticallyKnownType(voidDescriptor);
 
-  public final DexType booleanArrayType = createType(booleanArrayDescriptor);
-  public final DexType byteArrayType = createType(byteArrayDescriptor);
-  public final DexType charArrayType = createType(charArrayDescriptor);
-  public final DexType doubleArrayType = createType(doubleArrayDescriptor);
-  public final DexType floatArrayType = createType(floatArrayDescriptor);
-  public final DexType intArrayType = createType(intArrayDescriptor);
-  public final DexType longArrayType = createType(longArrayDescriptor);
-  public final DexType shortArrayType = createType(shortArrayDescriptor);
+  public final DexType booleanArrayType = createStaticallyKnownType(booleanArrayDescriptor);
+   public final DexType byteArrayType = createStaticallyKnownType(byteArrayDescriptor);
+   public final DexType charArrayType = createStaticallyKnownType(charArrayDescriptor);
+   public final DexType doubleArrayType = createStaticallyKnownType(doubleArrayDescriptor);
+   public final DexType floatArrayType = createStaticallyKnownType(floatArrayDescriptor);
+   public final DexType intArrayType = createStaticallyKnownType(intArrayDescriptor);
+   public final DexType longArrayType = createStaticallyKnownType(longArrayDescriptor);
+   public final DexType shortArrayType = createStaticallyKnownType(shortArrayDescriptor);
 
-  public final DexType boxedBooleanType = createType(boxedBooleanDescriptor);
-  public final DexType boxedByteType = createType(boxedByteDescriptor);
-  public final DexType boxedCharType = createType(boxedCharDescriptor);
-  public final DexType boxedDoubleType = createType(boxedDoubleDescriptor);
-  public final DexType boxedFloatType = createType(boxedFloatDescriptor);
-  public final DexType boxedIntType = createType(boxedIntDescriptor);
-  public final DexType boxedLongType = createType(boxedLongDescriptor);
-  public final DexType boxedShortType = createType(boxedShortDescriptor);
-  public final DexType boxedNumberType = createType(boxedNumberDescriptor);
-  public final DexType boxedVoidType = createType(boxedVoidDescriptor);
+  public final DexType boxedBooleanType = createStaticallyKnownType(boxedBooleanDescriptor);
+  public final DexType boxedByteType = createStaticallyKnownType(boxedByteDescriptor);
+  public final DexType boxedCharType = createStaticallyKnownType(boxedCharDescriptor);
+  public final DexType boxedDoubleType = createStaticallyKnownType(boxedDoubleDescriptor);
+  public final DexType boxedFloatType = createStaticallyKnownType(boxedFloatDescriptor);
+  public final DexType boxedIntType = createStaticallyKnownType(boxedIntDescriptor);
+  public final DexType boxedLongType = createStaticallyKnownType(boxedLongDescriptor);
+  public final DexType boxedShortType = createStaticallyKnownType(boxedShortDescriptor);
+  public final DexType boxedNumberType = createStaticallyKnownType(boxedNumberDescriptor);
+  public final DexType boxedVoidType = createStaticallyKnownType(boxedVoidDescriptor);
 
-  public final DexType charSequenceType = createType(charSequenceDescriptor);
-  public final DexType charSequenceArrayType = createType(charSequenceArrayDescriptor);
-  public final DexType stringType = createType(stringDescriptor);
-  public final DexType stringArrayType = createType(stringArrayDescriptor);
-  public final DexType objectType = createType(objectDescriptor);
-  public final DexType objectArrayType = createType(objectArrayDescriptor);
-  public final DexType classArrayType = createType(classArrayDescriptor);
-  public final DexType enumType = createType(enumDescriptor);
-  public final DexType annotationType = createType(annotationDescriptor);
-  public final DexType objectsType = createType(objectsDescriptor);
-  public final DexType collectionsType = createType(collectionsDescriptor);
-  public final DexType iterableType = createType(iterableDescriptor);
-  public final DexType mathType = createType(mathDescriptor);
-  public final DexType strictMathType = createType(strictMathDescriptor);
-  public final DexType referenceFieldUpdaterType = createType(referenceFieldUpdaterDescriptor);
+  public final DexType charSequenceType = createStaticallyKnownType(charSequenceDescriptor);
+  public final DexType charSequenceArrayType =
+      createStaticallyKnownType(charSequenceArrayDescriptor);
+  public final DexType stringType = createStaticallyKnownType(stringDescriptor);
+  public final DexType stringArrayType = createStaticallyKnownType(stringArrayDescriptor);
+  public final DexType objectType = createStaticallyKnownType(objectDescriptor);
+  public final DexType objectArrayType = createStaticallyKnownType(objectArrayDescriptor);
+  public final DexType classArrayType = createStaticallyKnownType(classArrayDescriptor);
+  public final DexType enumType = createStaticallyKnownType(enumDescriptor);
+  public final DexType annotationType = createStaticallyKnownType(annotationDescriptor);
+  public final DexType objectsType = createStaticallyKnownType(objectsDescriptor);
+  public final DexType collectionsType = createStaticallyKnownType(collectionsDescriptor);
+  public final DexType iterableType = createStaticallyKnownType(iterableDescriptor);
+  public final DexType mathType = createStaticallyKnownType(mathDescriptor);
+  public final DexType strictMathType = createStaticallyKnownType(strictMathDescriptor);
+  public final DexType referenceFieldUpdaterType =
+      createStaticallyKnownType(referenceFieldUpdaterDescriptor);
 
-  public final DexType classType = createType(classDescriptor);
-  public final DexType classLoaderType = createType(classLoaderDescriptor);
-  public final DexType fieldType = createType(fieldDescriptor);
-  public final DexType methodType = createType(methodDescriptor);
-  public final DexType autoCloseableType = createType(autoCloseableDescriptor);
+  public final DexType classType = createStaticallyKnownType(classDescriptor);
+  public final DexType classLoaderType = createStaticallyKnownType(classLoaderDescriptor);
+  public final DexType fieldType = createStaticallyKnownType(fieldDescriptor);
+  public final DexType methodType = createStaticallyKnownType(methodDescriptor);
+  public final DexType autoCloseableType = createStaticallyKnownType(autoCloseableDescriptor);
 
-  public final DexType stringBuilderType = createType(stringBuilderDescriptor);
-  public final DexType stringBufferType = createType(stringBufferDescriptor);
+  public final DexType stringBuilderType = createStaticallyKnownType(stringBuilderDescriptor);
+  public final DexType stringBufferType = createStaticallyKnownType(stringBufferDescriptor);
 
-  public final DexType varHandleType = createType(varHandleDescriptor);
-  public final DexType methodHandleType = createType(methodHandleDescriptor);
-  public final DexType methodTypeType = createType(methodTypeDescriptor);
-  public final DexType invocationHandlerType = createType(invocationHandlerDescriptor);
-  public final DexType proxyType = createType(proxyDescriptor);
-  public final DexType serviceLoaderType = createType(serviceLoaderDescriptor);
+  public final DexType javaLangSystemType = createStaticallyKnownType("Ljava/lang/System;");
+  public final DexType javaIoPrintStreamType = createStaticallyKnownType("Ljava/io/PrintStream;");
+
+  public final DexType varHandleType = createStaticallyKnownType(varHandleDescriptor);
+  public final DexType methodHandleType = createStaticallyKnownType(methodHandleDescriptor);
+  public final DexType methodTypeType = createStaticallyKnownType(methodTypeDescriptor);
+  public final DexType invocationHandlerType =
+      createStaticallyKnownType(invocationHandlerDescriptor);
+  public final DexType proxyType = createStaticallyKnownType(proxyDescriptor);
+  public final DexType serviceLoaderType = createStaticallyKnownType(serviceLoaderDescriptor);
+
   public final DexType serviceLoaderConfigurationErrorType =
-      createType(serviceLoaderConfigurationErrorDescriptor);
-  public final DexType listType = createType(listDescriptor);
-  public final DexType setType = createType(setDescriptor);
-  public final DexType mapType = createType(mapDescriptor);
-  public final DexType mapEntryType = createType(mapEntryDescriptor);
-  public final DexType collectionType = createType(collectionDescriptor);
-  public final DexType comparatorType = createType(comparatorDescriptor);
-  public final DexType callableType = createType(callableDescriptor);
-  public final DexType supplierType = createType(supplierDescriptor);
-  public final DexType consumerType = createType(consumerDescriptor);
-  public final DexType runnableType = createType(runnableDescriptor);
-  public final DexType optionalType = createType(optionalDescriptor);
-  public final DexType optionalDoubleType = createType(optionalDoubleDescriptor);
-  public final DexType optionalIntType = createType(optionalIntDescriptor);
-  public final DexType optionalLongType = createType(optionalLongDescriptor);
-  public final DexType streamType = createType(streamDescriptor);
+      createStaticallyKnownType(serviceLoaderConfigurationErrorDescriptor);
+  public final DexType listType = createStaticallyKnownType(listDescriptor);
+  public final DexType setType = createStaticallyKnownType(setDescriptor);
+  public final DexType mapType = createStaticallyKnownType(mapDescriptor);
+  public final DexType mapEntryType = createStaticallyKnownType(mapEntryDescriptor);
+  public final DexType abstractMapSimpleEntryType =
+      createStaticallyKnownType("Ljava/util/AbstractMap$SimpleEntry;");
+  public final DexType collectionType = createStaticallyKnownType(collectionDescriptor);
+  public final DexType comparatorType = createStaticallyKnownType(comparatorDescriptor);
+  public final DexType callableType = createStaticallyKnownType(callableDescriptor);
+  public final DexType supplierType = createStaticallyKnownType(supplierDescriptor);
+  public final DexType consumerType = createStaticallyKnownType(consumerDescriptor);
+  public final DexType runnableType = createStaticallyKnownType(runnableDescriptor);
+  public final DexType optionalType = createStaticallyKnownType(optionalDescriptor);
+  public final DexType optionalDoubleType = createStaticallyKnownType(optionalDoubleDescriptor);
+  public final DexType optionalIntType = createStaticallyKnownType(optionalIntDescriptor);
+  public final DexType optionalLongType = createStaticallyKnownType(optionalLongDescriptor);
+  public final DexType streamType = createStaticallyKnownType(streamDescriptor);
 
-  public final DexType runtimeExceptionType = createType(runtimeExceptionDescriptor);
-  public final DexType throwableType = createType(throwableDescriptor);
-  public final DexType illegalAccessErrorType = createType(illegalAccessErrorDescriptor);
-  public final DexType icceType = createType(icceDescriptor);
+  public final DexType doubleConsumer =
+      createStaticallyKnownType("Ljava/util/function/DoubleConsumer;");
+  public final DexType longConsumer =
+      createStaticallyKnownType("Ljava/util/function/LongConsumer;");
+  public final DexType intConsumer = createStaticallyKnownType("Ljava/util/function/IntConsumer;");
+
+  public final DexType runtimeExceptionType = createStaticallyKnownType(runtimeExceptionDescriptor);
+  public final DexType throwableType = createStaticallyKnownType(throwableDescriptor);
+  public final DexType illegalAccessErrorType =
+      createStaticallyKnownType(illegalAccessErrorDescriptor);
+  public final DexType icceType = createStaticallyKnownType(icceDescriptor);
   public final DexType exceptionInInitializerErrorType =
-      createType(exceptionInInitializerErrorDescriptor);
-  public final DexType noClassDefFoundErrorType = createType(noClassDefFoundErrorDescriptor);
-  public final DexType noSuchFieldErrorType = createType(noSuchFieldErrorDescriptor);
-  public final DexType npeType = createType(npeDescriptor);
+      createStaticallyKnownType(exceptionInInitializerErrorDescriptor);
+  public final DexType noClassDefFoundErrorType =
+      createStaticallyKnownType(noClassDefFoundErrorDescriptor);
+  public final DexType noSuchFieldErrorType = createStaticallyKnownType(noSuchFieldErrorDescriptor);
+  public final DexType npeType = createStaticallyKnownType(npeDescriptor);
   public final DexType reflectiveOperationExceptionType =
-      createType(reflectiveOperationExceptionDescriptor);
+      createStaticallyKnownType(reflectiveOperationExceptionDescriptor);
+
+  public final DexType javaUtilLoggingLoggerType =
+      createStaticallyKnownType("Ljava/util/logging/Logger;");
+  public final DexType androidUtilLogType = createStaticallyKnownType("Landroid/util/Log;");
+
+  public final DexType androidOsBuildVersionType =
+      createStaticallyKnownType("Landroid/os/Build$VERSION;");
 
   public final StringBuildingMethods stringBuilderMethods =
       new StringBuildingMethods(stringBuilderType);
@@ -381,6 +409,7 @@
   public final ObjectMethods objectMethods = new ObjectMethods();
   public final StringMethods stringMethods = new StringMethods();
   public final LongMethods longMethods = new LongMethods();
+  public final DoubleMethods doubleMethods = new DoubleMethods();
   public final JavaUtilArraysMethods utilArraysMethods = new JavaUtilArraysMethods();
   public final ThrowableMethods throwableMethods = new ThrowableMethods();
   public final AssertionErrorMethods assertionErrorMethods = new AssertionErrorMethods();
@@ -402,50 +431,58 @@
 
   public final DexString deserializeLambdaMethodName = createString("$deserializeLambda$");
   public final DexProto deserializeLambdaMethodProto =
-      createProto(objectType, createType("Ljava/lang/invoke/SerializedLambda;"));
+      createProto(objectType, createStaticallyKnownType("Ljava/lang/invoke/SerializedLambda;"));
 
   // Dex system annotations.
   // See https://source.android.com/devices/tech/dalvik/dex-format.html#system-annotation
-  public final DexType annotationDefault = createType("Ldalvik/annotation/AnnotationDefault;");
-  public final DexType annotationEnclosingClass = createType("Ldalvik/annotation/EnclosingClass;");
-  public final DexType annotationEnclosingMethod = createType(
-      "Ldalvik/annotation/EnclosingMethod;");
-  public final DexType annotationInnerClass = createType("Ldalvik/annotation/InnerClass;");
-  public final DexType annotationMemberClasses = createType("Ldalvik/annotation/MemberClasses;");
-  public final DexType annotationMethodParameters = createType(
-      "Ldalvik/annotation/MethodParameters;");
-  public final DexType annotationSignature = createType("Ldalvik/annotation/Signature;");
-  public final DexType annotationSourceDebugExtension = createType(
-      "Ldalvik/annotation/SourceDebugExtension;");
-  public final DexType annotationThrows = createType("Ldalvik/annotation/Throws;");
+  public final DexType annotationDefault =
+      createStaticallyKnownType("Ldalvik/annotation/AnnotationDefault;");
+  public final DexType annotationEnclosingClass =
+      createStaticallyKnownType("Ldalvik/annotation/EnclosingClass;");
+  public final DexType annotationEnclosingMethod =
+      createStaticallyKnownType("Ldalvik/annotation/EnclosingMethod;");
+  public final DexType annotationInnerClass =
+      createStaticallyKnownType("Ldalvik/annotation/InnerClass;");
+  public final DexType annotationMemberClasses =
+      createStaticallyKnownType("Ldalvik/annotation/MemberClasses;");
+  public final DexType annotationMethodParameters =
+      createStaticallyKnownType("Ldalvik/annotation/MethodParameters;");
+  public final DexType annotationSignature =
+      createStaticallyKnownType("Ldalvik/annotation/Signature;");
+  public final DexType annotationSourceDebugExtension =
+      createStaticallyKnownType("Ldalvik/annotation/SourceDebugExtension;");
+  public final DexType annotationThrows = createStaticallyKnownType("Ldalvik/annotation/Throws;");
   public final DexType annotationSynthesizedClassMap =
-      createType("Lcom/android/tools/r8/annotations/SynthesizedClassMap;");
+      createStaticallyKnownType("Lcom/android/tools/r8/annotations/SynthesizedClassMap;");
   public final DexType annotationCovariantReturnType =
-      createType("Ldalvik/annotation/codegen/CovariantReturnType;");
+      createStaticallyKnownType("Ldalvik/annotation/codegen/CovariantReturnType;");
   public final DexType annotationCovariantReturnTypes =
-      createType("Ldalvik/annotation/codegen/CovariantReturnType$CovariantReturnTypes;");
+      createStaticallyKnownType(
+          "Ldalvik/annotation/codegen/CovariantReturnType$CovariantReturnTypes;");
   public final DexType annotationReachabilitySensitive =
-      createType("Ldalvik/annotation/optimization/ReachabilitySensitive;");
+      createStaticallyKnownType("Ldalvik/annotation/optimization/ReachabilitySensitive;");
 
   // Runtime affecting yet class-retained annotations.
   public final DexType dalvikFastNativeAnnotation =
-      createType("Ldalvik/annotation/optimization/FastNative;");
+      createStaticallyKnownType("Ldalvik/annotation/optimization/FastNative;");
   public final DexType dalvikCriticalNativeAnnotation =
-      createType("Ldalvik/annotation/optimization/CriticalNative;");
+      createStaticallyKnownType("Ldalvik/annotation/optimization/CriticalNative;");
 
   private static final String METAFACTORY_METHOD_NAME = "metafactory";
   private static final String METAFACTORY_ALT_METHOD_NAME = "altMetafactory";
 
-  public final DexType metafactoryType = createType("Ljava/lang/invoke/LambdaMetafactory;");
-  public final DexType callSiteType = createType("Ljava/lang/invoke/CallSite;");
-  public final DexType lookupType = createType("Ljava/lang/invoke/MethodHandles$Lookup;");
-  public final DexType iteratorType = createType("Ljava/util/Iterator;");
-  public final DexType listIteratorType = createType("Ljava/util/ListIterator;");
-  public final DexType enumerationType = createType("Ljava/util/Enumeration;");
-  public final DexType serializableType = createType("Ljava/io/Serializable;");
-  public final DexType externalizableType = createType("Ljava/io/Externalizable;");
-  public final DexType cloneableType = createType("Ljava/lang/Cloneable;");
-  public final DexType comparableType = createType("Ljava/lang/Comparable;");
+  public final DexType metafactoryType =
+      createStaticallyKnownType("Ljava/lang/invoke/LambdaMetafactory;");
+  public final DexType callSiteType = createStaticallyKnownType("Ljava/lang/invoke/CallSite;");
+  public final DexType lookupType =
+      createStaticallyKnownType("Ljava/lang/invoke/MethodHandles$Lookup;");
+  public final DexType iteratorType = createStaticallyKnownType("Ljava/util/Iterator;");
+  public final DexType listIteratorType = createStaticallyKnownType("Ljava/util/ListIterator;");
+  public final DexType enumerationType = createStaticallyKnownType("Ljava/util/Enumeration;");
+  public final DexType serializableType = createStaticallyKnownType("Ljava/io/Serializable;");
+  public final DexType externalizableType = createStaticallyKnownType("Ljava/io/Externalizable;");
+  public final DexType cloneableType = createStaticallyKnownType("Ljava/lang/Cloneable;");
+  public final DexType comparableType = createStaticallyKnownType("Ljava/lang/Comparable;");
 
   public final ServiceLoaderMethods serviceLoaderMethods = new ServiceLoaderMethods();
 
@@ -509,7 +546,7 @@
       createMethod(objectType, deserializeLambdaMethodProto, deserializeLambdaMethodName);
 
   public final DexType stringConcatFactoryType =
-      createType("Ljava/lang/invoke/StringConcatFactory;");
+      createStaticallyKnownType("Ljava/lang/invoke/StringConcatFactory;");
 
   public final DexMethod stringConcatWithConstantsMethod =
       createMethod(
@@ -633,6 +670,20 @@
     }
   }
 
+  public class DoubleMethods {
+
+    public final DexMethod isNaN;
+
+    private DoubleMethods() {
+      isNaN =
+          createMethod(
+              boxedDoubleDescriptor,
+              createString("isNaN"),
+              booleanDescriptor,
+              new DexString[] {doubleDescriptor});
+    }
+  }
+
   public class JavaUtilArraysMethods {
 
     public final DexMethod asList;
@@ -1315,20 +1366,60 @@
     return markers;
   }
 
-  synchronized public DexType createType(DexString descriptor) {
+  // Non-synchronized internal create.
+  private DexType internalCreateType(DexString descriptor) {
     assert !sorted;
     assert descriptor != null;
     DexType result = types.get(descriptor);
     if (result == null) {
       result = new DexType(descriptor);
-      assert result.isArrayType() || result.isClassType() || result.isPrimitiveType() ||
-          result.isVoidType();
+      assert result.isArrayType()
+          || result.isClassType()
+          || result.isPrimitiveType()
+          || result.isVoidType();
       assert !isInternalSentinel(result);
       types.put(descriptor, result);
     }
     return result;
   }
 
+  private DexType createStaticallyKnownType(String descriptor) {
+    return createStaticallyKnownType(createString(descriptor));
+  }
+
+  private DexType createStaticallyKnownType(DexString descriptor) {
+    DexType type = internalCreateType(descriptor);
+    // Conservatively add all statically known types to "compiler synthesized types set".
+    addPossiblySynthesizedType(type);
+    return type;
+  }
+
+  // Safe synchronized external create. May be used for statically known types in synthetic code.
+  // See the generated BackportedMethods.java for reference.
+  public synchronized DexType createSynthesizedType(String descriptor) {
+    DexType type = internalCreateType(createString(descriptor));
+    addPossiblySynthesizedType(type);
+    return type;
+  }
+
+  private void addPossiblySynthesizedType(DexType type) {
+    if (type.isArrayType()) {
+      type = type.toBaseType(this);
+    }
+    if (type.isClassType()) {
+      possibleCompilerSynthesizedTypes.add(type);
+    }
+  }
+
+  public void forEachPossiblyCompilerSynthesizedType(Consumer<DexType> fn) {
+    possibleCompilerSynthesizedTypes.forEach(fn);
+  }
+
+  // Safe synchronized external create. Should never be used to create a statically known type!
+  public synchronized DexType createType(DexString descriptor) {
+    return internalCreateType(descriptor);
+  }
+
   public DexType createType(String descriptor) {
     return createType(createString(descriptor));
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 3e1ed8a..b8210c8 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -210,7 +210,7 @@
 
   public static class Builder extends DexApplication.Builder<Builder> {
 
-    private final ImmutableList<DexLibraryClass> libraryClasses;
+    private ImmutableList<DexLibraryClass> libraryClasses;
     private ImmutableList<DexClasspathClass> classpathClasses;
 
     Builder(LazyLoadedDexApplication application) {
@@ -233,6 +233,16 @@
       return this;
     }
 
+    public Builder replaceLibraryClasses(Collection<DexLibraryClass> libraryClasses) {
+      this.libraryClasses = ImmutableList.copyOf(libraryClasses);
+      return self();
+    }
+
+    public Builder replaceClasspathClasses(Collection<DexClasspathClass> classpathClasses) {
+      this.classpathClasses = ImmutableList.copyOf(classpathClasses);
+      return self();
+    }
+
     public Builder addClasspathClasses(List<DexClasspathClass> classes) {
       classpathClasses =
           ImmutableList.<DexClasspathClass>builder()
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 6ff25d9..fd0e452 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
@@ -527,6 +527,19 @@
     return rewritableMethods.getProvider(original);
   }
 
+  public static void checkForAssumedLibraryTypes(AppView<?> appView) {
+    Map<DexString, Map<DexType, DexType>> retargetCoreLibMember =
+        appView.options().desugaredLibraryConfiguration.getRetargetCoreLibMember();
+    for (DexString methodName : retargetCoreLibMember.keySet()) {
+      for (DexType inType : retargetCoreLibMember.get(methodName).keySet()) {
+        DexClass typeClass = appView.definitionFor(inType);
+        if (typeClass == null) {
+          RewritableMethods.warnMissingRetargetCoreLibraryMember(inType, appView);
+        }
+      }
+    }
+  }
+
   private static final class RewritableMethods {
 
     // Map backported method to a provider for creating the actual target method (with code).
@@ -1574,9 +1587,9 @@
       DexType[] consumerTypes =
           new DexType[]{
               factory.consumerType,
-              factory.createType("Ljava/util/function/DoubleConsumer;"),
-              factory.createType("Ljava/util/function/LongConsumer;"),
-              factory.createType("Ljava/util/function/IntConsumer;")
+              factory.doubleConsumer,
+              factory.longConsumer,
+              factory.intConsumer
           };
       TemplateMethodFactory[] methodFactories =
           new TemplateMethodFactory[]{
@@ -1666,7 +1679,7 @@
               method, BackportedMethods::StreamMethods_ofNullable, "ofNullable"));
     }
 
-    private void warnMissingRetargetCoreLibraryMember(DexType type, AppView<?> appView) {
+    private static void warnMissingRetargetCoreLibraryMember(DexType type, AppView<?> appView) {
       StringDiagnostic warning =
           new StringDiagnostic(
               "Cannot retarget core library member "
@@ -1683,9 +1696,7 @@
       for (DexString methodName : retargetCoreLibMember.keySet()) {
         for (DexType inType : retargetCoreLibMember.get(methodName).keySet()) {
           DexClass typeClass = appView.definitionFor(inType);
-          if (typeClass == null) {
-            warnMissingRetargetCoreLibraryMember(inType, appView);
-          } else {
+          if (typeClass != null) {
             DexType newHolder = retargetCoreLibMember.get(methodName).get(inType);
             List<DexEncodedMethod> found = findDexEncodedMethodsWithName(methodName, typeClass);
             for (DexEncodedMethod encodedMethod : found) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
index 02cb581..0546e9d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
@@ -204,8 +204,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/CharSequence;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.charSequenceType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 true),
             new CfStore(ValueType.INT, 2),
@@ -214,8 +214,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/CharSequence;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.charSequenceType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 true),
             new CfStore(ValueType.INT, 3),
@@ -235,11 +235,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Math;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Math;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.intType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("min")),
                 false),
             new CfStore(ValueType.INT, 5),
@@ -253,9 +253,9 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/CharSequence;"),
+                    options.itemFactory.charSequenceType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("C"), options.itemFactory.createType("I")),
+                        options.itemFactory.charType, options.itemFactory.intType),
                     options.itemFactory.createString("charAt")),
                 true),
             new CfStore(ValueType.INT, 6),
@@ -265,9 +265,9 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/CharSequence;"),
+                    options.itemFactory.charSequenceType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("C"), options.itemFactory.createType("I")),
+                        options.itemFactory.charType, options.itemFactory.intType),
                     options.itemFactory.createString("charAt")),
                 true),
             new CfStore(ValueType.INT, 7),
@@ -321,23 +321,23 @@
         1,
         ImmutableList.of(
             label0,
-            new CfNew(options.itemFactory.createType("Ljava/lang/String;")),
+            new CfNew(options.itemFactory.stringType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.INT, 0),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("[C"), options.itemFactory.createType("I")),
+                        options.itemFactory.charArrayType, options.itemFactory.intType),
                     options.itemFactory.createString("toChars")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("[C")),
+                        options.itemFactory.voidType, options.itemFactory.charArrayType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -373,16 +373,16 @@
         ImmutableList.of(
             label0,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("Ljava/lang/AutoCloseable;")),
+            new CfInstanceOf(options.itemFactory.autoCloseableType),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
             label1,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("Ljava/lang/AutoCloseable;")),
+            new CfCheckCast(options.itemFactory.autoCloseableType),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/AutoCloseable;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.autoCloseableType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("close")),
                 true),
             new CfGoto(label11),
@@ -391,22 +391,21 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Object;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Class;")),
+                    options.itemFactory.objectType,
+                    options.itemFactory.createProto(options.itemFactory.classType),
                     options.itemFactory.createString("getClass")),
                 false),
             new CfConstString(options.itemFactory.createString("close")),
             new CfConstNumber(0, ValueType.INT),
-            new CfNewArray(options.itemFactory.createType("[Ljava/lang/Class;")),
+            new CfNewArray(options.itemFactory.createSynthesizedType("[Ljava/lang/Class;")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Class;"),
+                    options.itemFactory.classType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/reflect/Method;"),
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("[Ljava/lang/Class;")),
+                        options.itemFactory.createSynthesizedType("Ljava/lang/reflect/Method;"),
+                        options.itemFactory.stringType,
+                        options.itemFactory.createSynthesizedType("[Ljava/lang/Class;")),
                     options.itemFactory.createString("getMethod")),
                 false),
             new CfStore(ValueType.OBJECT, 2),
@@ -414,15 +413,15 @@
             new CfLoad(ValueType.OBJECT, 2),
             new CfLoad(ValueType.OBJECT, 1),
             new CfConstNumber(0, ValueType.INT),
-            new CfNewArray(options.itemFactory.createType("[Ljava/lang/Object;")),
+            new CfNewArray(options.itemFactory.createSynthesizedType("[Ljava/lang/Object;")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/reflect/Method;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/reflect/Method;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("[Ljava/lang/Object;")),
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.createSynthesizedType("[Ljava/lang/Object;")),
                     options.itemFactory.createString("invoke")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -431,124 +430,116 @@
             label5,
             new CfStore(ValueType.OBJECT, 2),
             label6,
-            new CfNew(options.itemFactory.createType("Ljava/lang/AssertionError;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/AssertionError;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Object;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Class;")),
+                    options.itemFactory.objectType,
+                    options.itemFactory.createProto(options.itemFactory.classType),
                     options.itemFactory.createString("getClass")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.objectType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(options.itemFactory.createString(" does not have a close() method.")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/AssertionError;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/AssertionError;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("Ljava/lang/Throwable;")),
+                        options.itemFactory.voidType,
+                        options.itemFactory.stringType,
+                        options.itemFactory.throwableType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
             label7,
             new CfStore(ValueType.OBJECT, 2),
             label8,
-            new CfNew(options.itemFactory.createType("Ljava/lang/AssertionError;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/AssertionError;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfConstString(options.itemFactory.createString("Fail to call close() on ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Object;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Class;")),
+                    options.itemFactory.objectType,
+                    options.itemFactory.createProto(options.itemFactory.classType),
                     options.itemFactory.createString("getClass")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.objectType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/AssertionError;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/AssertionError;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("Ljava/lang/Throwable;")),
+                        options.itemFactory.voidType,
+                        options.itemFactory.stringType,
+                        options.itemFactory.throwableType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -559,9 +550,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/reflect/InvocationTargetException;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Throwable;")),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/reflect/InvocationTargetException;"),
+                    options.itemFactory.createProto(options.itemFactory.throwableType),
                     options.itemFactory.createString("getCause")),
                 false),
             new CfThrow(),
@@ -586,42 +577,46 @@
                 label2,
                 label4,
                 ImmutableList.of(
-                    options.itemFactory.createType("Ljava/lang/NoSuchMethodException;")),
-                ImmutableList.of(label5)),
-            new CfTryCatch(
-                label2,
-                label4,
-                ImmutableList.of(options.itemFactory.createType("Ljava/lang/SecurityException;")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NoSuchMethodException;")),
                 ImmutableList.of(label5)),
             new CfTryCatch(
                 label2,
                 label4,
                 ImmutableList.of(
-                    options.itemFactory.createType("Ljava/lang/IllegalAccessException;")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/SecurityException;")),
+                ImmutableList.of(label5)),
+            new CfTryCatch(
+                label2,
+                label4,
+                ImmutableList.of(
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/IllegalAccessException;")),
                 ImmutableList.of(label7)),
             new CfTryCatch(
                 label2,
                 label4,
                 ImmutableList.of(
-                    options.itemFactory.createType("Ljava/lang/IllegalArgumentException;")),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/IllegalArgumentException;")),
                 ImmutableList.of(label7)),
             new CfTryCatch(
                 label2,
                 label4,
                 ImmutableList.of(
-                    options.itemFactory.createType("Ljava/lang/ExceptionInInitializerError;")),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/ExceptionInInitializerError;")),
                 ImmutableList.of(label7)),
             new CfTryCatch(
                 label2,
                 label4,
                 ImmutableList.of(
-                    options.itemFactory.createType(
+                    options.itemFactory.createSynthesizedType(
                         "Ljava/lang/reflect/InvocationTargetException;")),
                 ImmutableList.of(label9)),
             new CfTryCatch(
                 label0,
                 label11,
-                ImmutableList.of(options.itemFactory.createType("Ljava/lang/Throwable;")),
+                ImmutableList.of(options.itemFactory.throwableType),
                 ImmutableList.of(label12))),
         ImmutableList.of());
   }
@@ -640,16 +635,16 @@
         6,
         ImmutableList.of(
             label0,
-            new CfNew(options.itemFactory.createType("Ljava/util/ArrayList;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/util/ArrayList;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 0),
             new CfArrayLength(),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/ArrayList;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/ArrayList;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("I")),
+                        options.itemFactory.voidType, options.itemFactory.intType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 1),
@@ -675,19 +670,17 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/ArrayList;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/ArrayList;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.booleanType, options.itemFactory.objectType),
                     options.itemFactory.createString("add")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -699,10 +692,10 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/List;"),
-                        options.itemFactory.createType("Ljava/util/List;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/List;"),
+                        options.itemFactory.createSynthesizedType("Ljava/util/List;")),
                     options.itemFactory.createString("unmodifiableList")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -724,17 +717,17 @@
         ImmutableList.of(
             label0,
             new CfNew(
-                options.itemFactory.createType("Ljava/util/AbstractMap$SimpleImmutableEntry;")),
+                options.itemFactory.createSynthesizedType(
+                    "Ljava/util/AbstractMap$SimpleImmutableEntry;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 0),
             label1,
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfLoad(ValueType.OBJECT, 1),
@@ -742,20 +735,20 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/AbstractMap$SimpleImmutableEntry;"),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/util/AbstractMap$SimpleImmutableEntry;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.voidType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType),
                     options.itemFactory.createString("<init>")),
                 false),
             label3,
@@ -782,16 +775,16 @@
         8,
         ImmutableList.of(
             label0,
-            new CfNew(options.itemFactory.createType("Ljava/util/HashMap;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/util/HashMap;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 0),
             new CfArrayLength(),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/HashMap;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/HashMap;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("I")),
+                        options.itemFactory.voidType, options.itemFactory.intType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 1),
@@ -816,18 +809,16 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Map$Entry;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Map$Entry;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("getKey")),
                 true),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfStore(ValueType.OBJECT, 6),
@@ -836,18 +827,16 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Map$Entry;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Map$Entry;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("getValue")),
                 true),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfStore(ValueType.OBJECT, 7),
@@ -858,61 +847,59 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/HashMap;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/HashMap;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType),
                     options.itemFactory.createString("put")),
                 false),
             new CfIf(If.Type.EQ, ValueType.OBJECT, label7),
             label6,
-            new CfNew(options.itemFactory.createType("Ljava/lang/IllegalArgumentException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/IllegalArgumentException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfConstString(options.itemFactory.createString("duplicate key: ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.OBJECT, 6),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.objectType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/IllegalArgumentException;"),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/IllegalArgumentException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -924,10 +911,10 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Map;"),
-                        options.itemFactory.createType("Ljava/util/Map;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Map;"),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Map;")),
                     options.itemFactory.createString("unmodifiableMap")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -951,16 +938,16 @@
         6,
         ImmutableList.of(
             label0,
-            new CfNew(options.itemFactory.createType("Ljava/util/HashSet;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/util/HashSet;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 0),
             new CfArrayLength(),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/HashSet;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/HashSet;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("I")),
+                        options.itemFactory.voidType, options.itemFactory.intType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 1),
@@ -986,69 +973,65 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/HashSet;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/HashSet;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.booleanType, options.itemFactory.objectType),
                     options.itemFactory.createString("add")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label5),
             label4,
-            new CfNew(options.itemFactory.createType("Ljava/lang/IllegalArgumentException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/IllegalArgumentException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfConstString(options.itemFactory.createString("duplicate element: ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.OBJECT, 5),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.objectType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/IllegalArgumentException;"),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/IllegalArgumentException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -1060,10 +1043,10 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Set;"),
-                        options.itemFactory.createType("Ljava/util/Set;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Set;"),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Set;")),
                     options.itemFactory.createString("unmodifiableSet")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -1086,22 +1069,22 @@
         4,
         ImmutableList.of(
             label0,
-            new CfNew(options.itemFactory.createType("Ljava/util/ArrayList;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/util/ArrayList;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collection;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collection;"),
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("size")),
                 true),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/ArrayList;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/ArrayList;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("I")),
+                        options.itemFactory.voidType, options.itemFactory.intType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 1),
@@ -1110,9 +1093,9 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collection;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collection;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Iterator;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Iterator;")),
                     options.itemFactory.createString("iterator")),
                 true),
             new CfStore(ValueType.OBJECT, 2),
@@ -1121,8 +1104,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("hasNext")),
                 true),
             new CfIf(If.Type.EQ, ValueType.INT, label5),
@@ -1130,9 +1113,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("next")),
                 true),
             new CfStore(ValueType.OBJECT, 3),
@@ -1142,19 +1124,17 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/ArrayList;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/ArrayList;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.booleanType, options.itemFactory.objectType),
                     options.itemFactory.createString("add")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -1165,10 +1145,10 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/List;"),
-                        options.itemFactory.createType("Ljava/util/List;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/List;"),
+                        options.itemFactory.createSynthesizedType("Ljava/util/List;")),
                     options.itemFactory.createString("unmodifiableList")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -1194,22 +1174,22 @@
         4,
         ImmutableList.of(
             label0,
-            new CfNew(options.itemFactory.createType("Ljava/util/HashMap;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/util/HashMap;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Map;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Map;"),
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("size")),
                 true),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/HashMap;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/HashMap;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("I")),
+                        options.itemFactory.voidType, options.itemFactory.intType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 1),
@@ -1218,17 +1198,17 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Map;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Map;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Set;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Set;")),
                     options.itemFactory.createString("entrySet")),
                 true),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Set;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Set;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Iterator;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Iterator;")),
                     options.itemFactory.createString("iterator")),
                 true),
             new CfStore(ValueType.OBJECT, 2),
@@ -1237,8 +1217,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("hasNext")),
                 true),
             new CfIf(If.Type.EQ, ValueType.INT, label8),
@@ -1246,12 +1226,11 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("next")),
                 true),
-            new CfCheckCast(options.itemFactory.createType("Ljava/util/Map$Entry;")),
+            new CfCheckCast(options.itemFactory.createSynthesizedType("Ljava/util/Map$Entry;")),
             new CfStore(ValueType.OBJECT, 3),
             label3,
             new CfLoad(ValueType.OBJECT, 1),
@@ -1260,18 +1239,16 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Map$Entry;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Map$Entry;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("getKey")),
                 true),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfLoad(ValueType.OBJECT, 3),
@@ -1279,29 +1256,27 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Map$Entry;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Map$Entry;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("getValue")),
                 true),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             label6,
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/HashMap;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/HashMap;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType),
                     options.itemFactory.createString("put")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -1312,10 +1287,10 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Map;"),
-                        options.itemFactory.createType("Ljava/util/Map;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Map;"),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Map;")),
                     options.itemFactory.createString("unmodifiableMap")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -1338,22 +1313,22 @@
         4,
         ImmutableList.of(
             label0,
-            new CfNew(options.itemFactory.createType("Ljava/util/HashSet;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/util/HashSet;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collection;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collection;"),
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("size")),
                 true),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/HashSet;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/HashSet;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("I")),
+                        options.itemFactory.voidType, options.itemFactory.intType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 1),
@@ -1362,9 +1337,9 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collection;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collection;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Iterator;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Iterator;")),
                     options.itemFactory.createString("iterator")),
                 true),
             new CfStore(ValueType.OBJECT, 2),
@@ -1373,8 +1348,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("hasNext")),
                 true),
             new CfIf(If.Type.EQ, ValueType.INT, label5),
@@ -1382,9 +1357,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("next")),
                 true),
             new CfStore(ValueType.OBJECT, 3),
@@ -1394,19 +1368,17 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/HashSet;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/HashSet;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.booleanType, options.itemFactory.objectType),
                     options.itemFactory.createString("add")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -1417,10 +1389,10 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Set;"),
-                        options.itemFactory.createType("Ljava/util/Set;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Set;"),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Set;")),
                     options.itemFactory.createString("unmodifiableSet")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -1441,18 +1413,18 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/List;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/List;")),
                     options.itemFactory.createString("emptyList")),
                 false),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Enumeration;"),
-                        options.itemFactory.createType("Ljava/util/Collection;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Enumeration;"),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Collection;")),
                     options.itemFactory.createString("enumeration")),
                 false),
             new CfReturn(ValueType.OBJECT)),
@@ -1471,17 +1443,17 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/List;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/List;")),
                     options.itemFactory.createString("emptyList")),
                 false),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/List;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/List;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Iterator;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Iterator;")),
                     options.itemFactory.createString("iterator")),
                 true),
             new CfReturn(ValueType.OBJECT)),
@@ -1501,17 +1473,17 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Collections;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Collections;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/List;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/List;")),
                     options.itemFactory.createString("emptyList")),
                 false),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/List;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/List;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/ListIterator;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/ListIterator;")),
                     options.itemFactory.createString("listIterator")),
                 true),
             new CfReturn(ValueType.OBJECT)),
@@ -1533,9 +1505,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Double;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Double;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"), options.itemFactory.createType("D")),
+                        options.itemFactory.longType, options.itemFactory.doubleType),
                     options.itemFactory.createString("doubleToLongBits")),
                 false),
             new CfStore(ValueType.LONG, 2),
@@ -1567,9 +1539,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Double;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Double;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("D")),
+                        options.itemFactory.booleanType, options.itemFactory.doubleType),
                     options.itemFactory.createString("isInfinite")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label1),
@@ -1577,9 +1549,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Double;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Double;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("D")),
+                        options.itemFactory.booleanType, options.itemFactory.doubleType),
                     options.itemFactory.createString("isNaN")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label1),
@@ -1609,9 +1581,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Float;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Float;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("F")),
+                        options.itemFactory.booleanType, options.itemFactory.floatType),
                     options.itemFactory.createString("isInfinite")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label1),
@@ -1619,9 +1591,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Float;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Float;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("F")),
+                        options.itemFactory.booleanType, options.itemFactory.floatType),
                     options.itemFactory.createString("isNaN")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label1),
@@ -1694,11 +1666,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Integer;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Integer;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.intType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("compare")),
                 false),
             new CfReturn(ValueType.INT),
@@ -1754,11 +1726,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Integer;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Integer;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.intType,
+                        options.itemFactory.stringType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("parseUnsignedInt")),
                 false),
             new CfReturn(ValueType.INT),
@@ -1786,8 +1758,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.stringType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 false),
             new CfConstNumber(1, ValueType.INT),
@@ -1797,9 +1769,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("C"), options.itemFactory.createType("I")),
+                        options.itemFactory.charType, options.itemFactory.intType),
                     options.itemFactory.createString("charAt")),
                 false),
             new CfConstNumber(43, ValueType.INT),
@@ -1810,10 +1782,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType, options.itemFactory.intType),
                     options.itemFactory.createString("substring")),
                 false),
             new CfStore(ValueType.OBJECT, 0),
@@ -1823,11 +1794,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.longType,
+                        options.itemFactory.stringType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("parseLong")),
                 false),
             new CfStore(ValueType.LONG, 2),
@@ -1839,55 +1810,52 @@
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
             new CfIf(If.Type.EQ, ValueType.INT, label5),
             label4,
-            new CfNew(options.itemFactory.createType("Ljava/lang/NumberFormatException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfConstString(options.itemFactory.createString("Input ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(options.itemFactory.createString(" in base ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 1),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(
@@ -1895,27 +1863,24 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/NumberFormatException;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -1994,11 +1959,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Integer;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Integer;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("toUnsignedString")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -2029,11 +1994,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType,
+                        options.itemFactory.longType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -2068,11 +2033,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J")),
+                        options.itemFactory.intType,
+                        options.itemFactory.longType,
+                        options.itemFactory.longType),
                     options.itemFactory.createString("compare")),
                 false),
             new CfReturn(ValueType.INT),
@@ -2219,11 +2184,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.longType,
+                        options.itemFactory.stringType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("parseUnsignedLong")),
                 false),
             new CfReturn(ValueType.LONG),
@@ -2266,8 +2231,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.stringType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 false),
             new CfStore(ValueType.INT, 2),
@@ -2275,16 +2240,16 @@
             new CfLoad(ValueType.INT, 2),
             new CfIf(If.Type.NE, ValueType.INT, label3),
             label2,
-            new CfNew(options.itemFactory.createType("Ljava/lang/NumberFormatException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfConstString(options.itemFactory.createString("empty string")),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/NumberFormatException;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -2296,35 +2261,33 @@
             new CfConstNumber(36, ValueType.INT),
             new CfIfCmp(If.Type.LE, ValueType.INT, label5),
             label4,
-            new CfNew(options.itemFactory.createType("Ljava/lang/NumberFormatException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfConstString(options.itemFactory.createString("illegal radix: ")),
             new CfLoad(ValueType.INT, 1),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType, options.itemFactory.intType),
                     options.itemFactory.createString("valueOf")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringType, options.itemFactory.stringType),
                     options.itemFactory.createString("concat")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/NumberFormatException;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -2335,11 +2298,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J")),
+                        options.itemFactory.longType,
+                        options.itemFactory.longType,
+                        options.itemFactory.longType),
                     options.itemFactory.createString("divideUnsigned")),
                 false),
             new CfStore(ValueType.LONG, 3),
@@ -2349,9 +2312,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("C"), options.itemFactory.createType("I")),
+                        options.itemFactory.charType, options.itemFactory.intType),
                     options.itemFactory.createString("charAt")),
                 false),
             new CfConstNumber(43, ValueType.INT),
@@ -2381,20 +2344,20 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("C"), options.itemFactory.createType("I")),
+                        options.itemFactory.charType, options.itemFactory.intType),
                     options.itemFactory.createString("charAt")),
                 false),
             new CfLoad(ValueType.INT, 1),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("C"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.intType,
+                        options.itemFactory.charType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("digit")),
                 false),
             new CfStore(ValueType.INT, 9),
@@ -2403,16 +2366,16 @@
             new CfConstNumber(-1, ValueType.INT),
             new CfIfCmp(If.Type.NE, ValueType.INT, label15),
             label14,
-            new CfNew(options.itemFactory.createType("Ljava/lang/NumberFormatException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/NumberFormatException;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -2437,36 +2400,35 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J")),
+                        options.itemFactory.longType,
+                        options.itemFactory.longType,
+                        options.itemFactory.longType),
                     options.itemFactory.createString("remainderUnsigned")),
                 false),
             new CfNumberConversion(NumericType.LONG, NumericType.INT),
             new CfIfCmp(If.Type.LE, ValueType.INT, label18),
             label17,
-            new CfNew(options.itemFactory.createType("Ljava/lang/NumberFormatException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfConstString(options.itemFactory.createString("Too large for unsigned long: ")),
             new CfLoad(ValueType.OBJECT, 0),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringType, options.itemFactory.stringType),
                     options.itemFactory.createString("concat")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/NumberFormatException;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NumberFormatException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -2608,11 +2570,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType,
+                        options.itemFactory.longType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("toUnsignedString")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -2674,11 +2636,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType,
+                        options.itemFactory.longType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -2694,7 +2656,7 @@
             new CfStore(ValueType.INT, 2),
             label6,
             new CfConstNumber(64, ValueType.INT),
-            new CfNewArray(options.itemFactory.createType("[C")),
+            new CfNewArray(options.itemFactory.charArrayType),
             new CfStore(ValueType.OBJECT, 3),
             label7,
             new CfLoad(ValueType.OBJECT, 3),
@@ -2712,9 +2674,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Integer;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Integer;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("numberOfTrailingZeros")),
                 false),
             new CfStore(ValueType.INT, 5),
@@ -2735,11 +2697,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("C"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.charType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("forDigit")),
                 false),
             new CfArrayStore(MemberType.CHAR),
@@ -2779,11 +2741,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J")),
+                        options.itemFactory.longType,
+                        options.itemFactory.longType,
+                        options.itemFactory.longType),
                     options.itemFactory.createString("divideUnsigned")),
                 false),
             new CfStore(ValueType.LONG, 5),
@@ -2805,11 +2767,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("C"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.charType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("forDigit")),
                 false),
             new CfArrayStore(MemberType.CHAR),
@@ -2834,11 +2796,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("C"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.charType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("forDigit")),
                 false),
             new CfArrayStore(MemberType.CHAR),
@@ -2850,7 +2812,7 @@
             new CfStore(ValueType.LONG, 0),
             new CfGoto(label22),
             label25,
-            new CfNew(options.itemFactory.createType("Ljava/lang/String;")),
+            new CfNew(options.itemFactory.stringType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 3),
             new CfLoad(ValueType.INT, 4),
@@ -2861,12 +2823,12 @@
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("[C"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.voidType,
+                        options.itemFactory.charArrayType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -2908,13 +2870,13 @@
             new CfLoad(ValueType.INT, 4),
             new CfReturn(ValueType.INT),
             label4,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -2972,13 +2934,13 @@
             new CfLoad(ValueType.LONG, 4),
             new CfReturn(ValueType.LONG),
             label7,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3002,13 +2964,13 @@
             new CfConstNumber(-2147483648, ValueType.INT),
             new CfIfCmp(If.Type.NE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3038,13 +3000,13 @@
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
             new CfIf(If.Type.NE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3193,11 +3155,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Math;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Math;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J")),
+                        options.itemFactory.longType,
+                        options.itemFactory.longType,
+                        options.itemFactory.longType),
                     options.itemFactory.createString("floorDiv")),
                 false),
             new CfReturn(ValueType.LONG),
@@ -3325,11 +3287,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Math;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Math;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J")),
+                        options.itemFactory.longType,
+                        options.itemFactory.longType,
+                        options.itemFactory.longType),
                     options.itemFactory.createString("floorMod")),
                 false),
             new CfNumberConversion(NumericType.LONG, NumericType.INT),
@@ -3354,13 +3316,13 @@
             new CfConstNumber(2147483647, ValueType.INT),
             new CfIfCmp(If.Type.NE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3390,13 +3352,13 @@
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
             new CfIf(If.Type.NE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3443,13 +3405,13 @@
             new CfLoad(ValueType.INT, 4),
             new CfReturn(ValueType.INT),
             label4,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3487,9 +3449,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("J")),
+                        options.itemFactory.intType, options.itemFactory.longType),
                     options.itemFactory.createString("numberOfLeadingZeros")),
                 false),
             new CfLoad(ValueType.LONG, 0),
@@ -3499,9 +3461,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("J")),
+                        options.itemFactory.intType, options.itemFactory.longType),
                     options.itemFactory.createString("numberOfLeadingZeros")),
                 false),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
@@ -3510,9 +3472,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("J")),
+                        options.itemFactory.intType, options.itemFactory.longType),
                     options.itemFactory.createString("numberOfLeadingZeros")),
                 false),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
@@ -3523,9 +3485,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Long;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Long;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("J")),
+                        options.itemFactory.intType, options.itemFactory.longType),
                     options.itemFactory.createString("numberOfLeadingZeros")),
                 false),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
@@ -3583,13 +3545,13 @@
             new CfLoad(ValueType.LONG, 5),
             new CfReturn(ValueType.LONG),
             label15,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3613,11 +3575,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Math;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Math;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J"),
-                        options.itemFactory.createType("J")),
+                        options.itemFactory.longType,
+                        options.itemFactory.longType,
+                        options.itemFactory.longType),
                     options.itemFactory.createString("multiplyExact")),
                 false),
             new CfReturn(ValueType.LONG),
@@ -3765,13 +3727,13 @@
             new CfConstNumber(-2147483648, ValueType.INT),
             new CfIfCmp(If.Type.NE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3800,13 +3762,13 @@
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
             new CfIf(If.Type.NE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3833,9 +3795,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Math;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Math;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("D"), options.itemFactory.createType("D")),
+                        options.itemFactory.doubleType, options.itemFactory.doubleType),
                     options.itemFactory.createString("nextUp")),
                 false),
             new CfNeg(NumericType.DOUBLE),
@@ -3859,9 +3821,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Math;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Math;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("F"), options.itemFactory.createType("F")),
+                        options.itemFactory.floatType, options.itemFactory.floatType),
                     options.itemFactory.createString("nextUp")),
                 false),
             new CfNeg(NumericType.FLOAT),
@@ -3904,13 +3866,13 @@
             new CfLoad(ValueType.INT, 4),
             new CfReturn(ValueType.INT),
             label4,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -3968,13 +3930,13 @@
             new CfLoad(ValueType.LONG, 4),
             new CfReturn(ValueType.LONG),
             label7,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -4005,13 +3967,13 @@
             new CfCmp(Cmp.Bias.NONE, NumericType.LONG),
             new CfIf(If.Type.EQ, ValueType.INT, label3),
             label2,
-            new CfNew(options.itemFactory.createType("Ljava/lang/ArithmeticException;")),
+            new CfNew(options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/ArithmeticException;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/ArithmeticException;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -4047,112 +4009,104 @@
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
             new CfIfCmp(If.Type.LE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/IndexOutOfBoundsException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfConstString(options.itemFactory.createString("Range [")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 0),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(options.itemFactory.createString(", ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 0),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(options.itemFactory.createString(" + ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 1),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(options.itemFactory.createString(") out of bounds for length ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 2),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;"),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/IndexOutOfBoundsException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -4184,92 +4138,86 @@
             new CfLoad(ValueType.INT, 2),
             new CfIfCmp(If.Type.LE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/IndexOutOfBoundsException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfConstString(options.itemFactory.createString("Range [")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 0),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(options.itemFactory.createString(", ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 1),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(options.itemFactory.createString(") out of bounds for length ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 2),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;"),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/IndexOutOfBoundsException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -4298,72 +4246,68 @@
             new CfLoad(ValueType.INT, 1),
             new CfIfCmp(If.Type.LT, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/IndexOutOfBoundsException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfConstString(options.itemFactory.createString("Index ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 0),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfConstString(options.itemFactory.createString(" out of bounds for length ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 1),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/IndexOutOfBoundsException;"),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/IndexOutOfBoundsException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -4398,11 +4342,11 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Comparator;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Comparator;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.intType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType),
                     options.itemFactory.createString("compare")),
                 true),
             label2,
@@ -4471,24 +4415,24 @@
             new CfReturn(ValueType.INT),
             label2,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[Z")),
+            new CfInstanceOf(options.itemFactory.booleanArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label6),
             label3,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[Z")),
+            new CfInstanceOf(options.itemFactory.booleanArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label4),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[Z")),
+            new CfCheckCast(options.itemFactory.booleanArrayType),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[Z")),
+            new CfCheckCast(options.itemFactory.booleanArrayType),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[Z"),
-                        options.itemFactory.createType("[Z")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.booleanArrayType,
+                        options.itemFactory.booleanArrayType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label4),
@@ -4500,24 +4444,24 @@
             new CfReturn(ValueType.INT),
             label6,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[B")),
+            new CfInstanceOf(options.itemFactory.byteArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label10),
             label7,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[B")),
+            new CfInstanceOf(options.itemFactory.byteArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label8),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[B")),
+            new CfCheckCast(options.itemFactory.byteArrayType),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[B")),
+            new CfCheckCast(options.itemFactory.byteArrayType),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[B"),
-                        options.itemFactory.createType("[B")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.byteArrayType,
+                        options.itemFactory.byteArrayType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label8),
@@ -4529,24 +4473,24 @@
             new CfReturn(ValueType.INT),
             label10,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[C")),
+            new CfInstanceOf(options.itemFactory.charArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label14),
             label11,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[C")),
+            new CfInstanceOf(options.itemFactory.charArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label12),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[C")),
+            new CfCheckCast(options.itemFactory.charArrayType),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[C")),
+            new CfCheckCast(options.itemFactory.charArrayType),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[C"),
-                        options.itemFactory.createType("[C")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.charArrayType,
+                        options.itemFactory.charArrayType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label12),
@@ -4558,24 +4502,24 @@
             new CfReturn(ValueType.INT),
             label14,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[D")),
+            new CfInstanceOf(options.itemFactory.doubleArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label18),
             label15,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[D")),
+            new CfInstanceOf(options.itemFactory.doubleArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label16),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[D")),
+            new CfCheckCast(options.itemFactory.doubleArrayType),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[D")),
+            new CfCheckCast(options.itemFactory.doubleArrayType),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[D"),
-                        options.itemFactory.createType("[D")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.doubleArrayType,
+                        options.itemFactory.doubleArrayType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label16),
@@ -4587,24 +4531,24 @@
             new CfReturn(ValueType.INT),
             label18,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[F")),
+            new CfInstanceOf(options.itemFactory.floatArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label22),
             label19,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[F")),
+            new CfInstanceOf(options.itemFactory.floatArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label20),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[F")),
+            new CfCheckCast(options.itemFactory.floatArrayType),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[F")),
+            new CfCheckCast(options.itemFactory.floatArrayType),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[F"),
-                        options.itemFactory.createType("[F")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.floatArrayType,
+                        options.itemFactory.floatArrayType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label20),
@@ -4616,24 +4560,24 @@
             new CfReturn(ValueType.INT),
             label22,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[I")),
+            new CfInstanceOf(options.itemFactory.intArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label26),
             label23,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[I")),
+            new CfInstanceOf(options.itemFactory.intArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label24),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[I")),
+            new CfCheckCast(options.itemFactory.intArrayType),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[I")),
+            new CfCheckCast(options.itemFactory.intArrayType),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[I"),
-                        options.itemFactory.createType("[I")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.intArrayType,
+                        options.itemFactory.intArrayType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label24),
@@ -4645,24 +4589,24 @@
             new CfReturn(ValueType.INT),
             label26,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[J")),
+            new CfInstanceOf(options.itemFactory.longArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label30),
             label27,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[J")),
+            new CfInstanceOf(options.itemFactory.longArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label28),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[J")),
+            new CfCheckCast(options.itemFactory.longArrayType),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[J")),
+            new CfCheckCast(options.itemFactory.longArrayType),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[J"),
-                        options.itemFactory.createType("[J")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.longArrayType,
+                        options.itemFactory.longArrayType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label28),
@@ -4674,24 +4618,24 @@
             new CfReturn(ValueType.INT),
             label30,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[S")),
+            new CfInstanceOf(options.itemFactory.shortArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label34),
             label31,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[S")),
+            new CfInstanceOf(options.itemFactory.shortArrayType),
             new CfIf(If.Type.EQ, ValueType.INT, label32),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[S")),
+            new CfCheckCast(options.itemFactory.shortArrayType),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[S")),
+            new CfCheckCast(options.itemFactory.shortArrayType),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[S"),
-                        options.itemFactory.createType("[S")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.shortArrayType,
+                        options.itemFactory.shortArrayType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label32),
@@ -4703,24 +4647,24 @@
             new CfReturn(ValueType.INT),
             label34,
             new CfLoad(ValueType.OBJECT, 0),
-            new CfInstanceOf(options.itemFactory.createType("[Ljava/lang/Object;")),
+            new CfInstanceOf(options.itemFactory.createSynthesizedType("[Ljava/lang/Object;")),
             new CfIf(If.Type.EQ, ValueType.INT, label38),
             label35,
             new CfLoad(ValueType.OBJECT, 1),
-            new CfInstanceOf(options.itemFactory.createType("[Ljava/lang/Object;")),
+            new CfInstanceOf(options.itemFactory.createSynthesizedType("[Ljava/lang/Object;")),
             new CfIf(If.Type.EQ, ValueType.INT, label36),
             new CfLoad(ValueType.OBJECT, 0),
-            new CfCheckCast(options.itemFactory.createType("[Ljava/lang/Object;")),
+            new CfCheckCast(options.itemFactory.createSynthesizedType("[Ljava/lang/Object;")),
             new CfLoad(ValueType.OBJECT, 1),
-            new CfCheckCast(options.itemFactory.createType("[Ljava/lang/Object;")),
+            new CfCheckCast(options.itemFactory.createSynthesizedType("[Ljava/lang/Object;")),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Arrays;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Arrays;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("[Ljava/lang/Object;"),
-                        options.itemFactory.createType("[Ljava/lang/Object;")),
+                        options.itemFactory.booleanType,
+                        options.itemFactory.createSynthesizedType("[Ljava/lang/Object;"),
+                        options.itemFactory.createSynthesizedType("[Ljava/lang/Object;")),
                     options.itemFactory.createString("deepEquals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label36),
@@ -4736,10 +4680,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Object;"),
+                    options.itemFactory.objectType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.booleanType, options.itemFactory.objectType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfReturn(ValueType.INT),
@@ -4770,10 +4713,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Object;"),
+                    options.itemFactory.objectType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.booleanType, options.itemFactory.objectType),
                     options.itemFactory.createString("equals")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -4809,8 +4751,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Object;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.objectType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("hashCode")),
                 false),
             label2,
@@ -4889,11 +4831,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.stringType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -4924,20 +4866,20 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.stringType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
-            new CfCheckCast(options.itemFactory.createType("Ljava/util/function/Supplier;")),
+            new CfCheckCast(
+                options.itemFactory.createSynthesizedType("Ljava/util/function/Supplier;")),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/function/Supplier;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/function/Supplier;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("get")),
                 true),
             new CfStore(ValueType.OBJECT, 2),
@@ -4947,11 +4889,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.objectType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.stringType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -4975,16 +4917,16 @@
             new CfLoad(ValueType.OBJECT, 0),
             new CfIf(If.Type.NE, ValueType.OBJECT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/NullPointerException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/NullPointerException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.OBJECT, 1),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/NullPointerException;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NullPointerException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -5010,11 +4952,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringType,
+                        options.itemFactory.objectType,
+                        options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -5043,9 +4985,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Object;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.objectType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             label2,
@@ -5071,8 +5012,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Optional;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Optional;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -5082,18 +5023,16 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Optional;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Optional;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("get")),
                 false),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/function/Consumer;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/function/Consumer;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.voidType, options.itemFactory.objectType),
                     options.itemFactory.createString("accept")),
                 true),
             new CfGoto(label3),
@@ -5102,8 +5041,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Runnable;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Runnable;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("run")),
                 true),
             label3,
@@ -5130,8 +5069,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalDouble;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalDouble;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -5141,16 +5080,17 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalDouble;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("D")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalDouble;"),
+                    options.itemFactory.createProto(options.itemFactory.doubleType),
                     options.itemFactory.createString("getAsDouble")),
                 false),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/function/DoubleConsumer;"),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/util/function/DoubleConsumer;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("D")),
+                        options.itemFactory.voidType, options.itemFactory.doubleType),
                     options.itemFactory.createString("accept")),
                 true),
             new CfGoto(label3),
@@ -5159,8 +5099,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Runnable;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Runnable;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("run")),
                 true),
             label3,
@@ -5187,8 +5127,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalInt;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalInt;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -5198,16 +5138,16 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalInt;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalInt;"),
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("getAsInt")),
                 false),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/function/IntConsumer;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/function/IntConsumer;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("I")),
+                        options.itemFactory.voidType, options.itemFactory.intType),
                     options.itemFactory.createString("accept")),
                 true),
             new CfGoto(label3),
@@ -5216,8 +5156,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Runnable;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Runnable;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("run")),
                 true),
             label3,
@@ -5244,8 +5184,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalLong;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalLong;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -5255,16 +5195,16 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalLong;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("J")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalLong;"),
+                    options.itemFactory.createProto(options.itemFactory.longType),
                     options.itemFactory.createString("getAsLong")),
                 false),
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/function/LongConsumer;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/function/LongConsumer;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("J")),
+                        options.itemFactory.voidType, options.itemFactory.longType),
                     options.itemFactory.createString("accept")),
                 true),
             new CfGoto(label3),
@@ -5273,8 +5213,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Runnable;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Runnable;"),
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("run")),
                 true),
             label3,
@@ -5299,8 +5239,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Optional;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Optional;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label1),
@@ -5330,8 +5270,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalDouble;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalDouble;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label1),
@@ -5361,8 +5301,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalInt;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalInt;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label1),
@@ -5392,8 +5332,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalLong;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalLong;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label1),
@@ -5425,10 +5365,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -5437,8 +5376,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Optional;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Optional;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label3),
@@ -5450,25 +5389,23 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/function/Supplier;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/function/Supplier;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("get")),
                 true),
-            new CfCheckCast(options.itemFactory.createType("Ljava/util/Optional;")),
+            new CfCheckCast(options.itemFactory.createSynthesizedType("Ljava/util/Optional;")),
             new CfStore(ValueType.OBJECT, 2),
             label4,
             new CfLoad(ValueType.OBJECT, 2),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Objects;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Objects;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.objectType, options.itemFactory.objectType),
                     options.itemFactory.createString("requireNonNull")),
                 false),
-            new CfCheckCast(options.itemFactory.createType("Ljava/util/Optional;")),
+            new CfCheckCast(options.itemFactory.createSynthesizedType("Ljava/util/Optional;")),
             new CfReturn(ValueType.OBJECT),
             label5),
         ImmutableList.of(),
@@ -5490,8 +5427,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Optional;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Optional;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -5500,18 +5437,17 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Optional;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Optional;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("get")),
                 false),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/Stream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/Stream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/Stream;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/stream/Stream;"),
+                        options.itemFactory.objectType),
                     options.itemFactory.createString("of")),
                 true),
             new CfReturn(ValueType.OBJECT),
@@ -5519,9 +5455,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/Stream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/Stream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/Stream;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/stream/Stream;")),
                     options.itemFactory.createString("empty")),
                 true),
             new CfReturn(ValueType.OBJECT),
@@ -5545,8 +5481,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalDouble;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalDouble;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -5555,17 +5491,18 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalDouble;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("D")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalDouble;"),
+                    options.itemFactory.createProto(options.itemFactory.doubleType),
                     options.itemFactory.createString("getAsDouble")),
                 false),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/DoubleStream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/DoubleStream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/DoubleStream;"),
-                        options.itemFactory.createType("D")),
+                        options.itemFactory.createSynthesizedType(
+                            "Ljava/util/stream/DoubleStream;"),
+                        options.itemFactory.doubleType),
                     options.itemFactory.createString("of")),
                 true),
             new CfReturn(ValueType.OBJECT),
@@ -5573,9 +5510,10 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/DoubleStream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/DoubleStream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/DoubleStream;")),
+                        options.itemFactory.createSynthesizedType(
+                            "Ljava/util/stream/DoubleStream;")),
                     options.itemFactory.createString("empty")),
                 true),
             new CfReturn(ValueType.OBJECT),
@@ -5599,8 +5537,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalInt;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalInt;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -5609,17 +5547,17 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalInt;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalInt;"),
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("getAsInt")),
                 false),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/IntStream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/IntStream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/IntStream;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/stream/IntStream;"),
+                        options.itemFactory.intType),
                     options.itemFactory.createString("of")),
                 true),
             new CfReturn(ValueType.OBJECT),
@@ -5627,9 +5565,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/IntStream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/IntStream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/IntStream;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/stream/IntStream;")),
                     options.itemFactory.createString("empty")),
                 true),
             new CfReturn(ValueType.OBJECT),
@@ -5653,8 +5591,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalLong;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalLong;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("isPresent")),
                 false),
             new CfIf(If.Type.EQ, ValueType.INT, label2),
@@ -5663,17 +5601,17 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/OptionalLong;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("J")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/OptionalLong;"),
+                    options.itemFactory.createProto(options.itemFactory.longType),
                     options.itemFactory.createString("getAsLong")),
                 false),
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/LongStream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/LongStream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/LongStream;"),
-                        options.itemFactory.createType("J")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/stream/LongStream;"),
+                        options.itemFactory.longType),
                     options.itemFactory.createString("of")),
                 true),
             new CfReturn(ValueType.OBJECT),
@@ -5681,9 +5619,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/LongStream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/LongStream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/LongStream;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/stream/LongStream;")),
                     options.itemFactory.createString("empty")),
                 true),
             new CfReturn(ValueType.OBJECT),
@@ -5785,9 +5723,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/Stream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/Stream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/Stream;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/stream/Stream;")),
                     options.itemFactory.createString("empty")),
                 true),
             new CfGoto(label2),
@@ -5796,10 +5734,10 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/stream/Stream;"),
+                    options.itemFactory.createSynthesizedType("Ljava/util/stream/Stream;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/stream/Stream;"),
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/stream/Stream;"),
+                        options.itemFactory.objectType),
                     options.itemFactory.createString("of")),
                 true),
             label2,
@@ -5833,8 +5771,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.stringType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 false),
             new CfStore(ValueType.INT, 2),
@@ -5848,9 +5786,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("codePointAt")),
                 false),
             new CfStore(ValueType.INT, 3),
@@ -5859,9 +5797,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("I")),
+                        options.itemFactory.booleanType, options.itemFactory.intType),
                     options.itemFactory.createString("isWhitespace")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label6),
@@ -5874,9 +5812,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("charCount")),
                 false),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
@@ -5911,27 +5849,27 @@
             label0,
             new CfLoad(ValueType.OBJECT, 0),
             new CfIf(If.Type.NE, ValueType.OBJECT, label1),
-            new CfNew(options.itemFactory.createType("Ljava/lang/NullPointerException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/NullPointerException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfConstString(options.itemFactory.createString("delimiter")),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/NullPointerException;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NullPointerException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 2),
@@ -5947,10 +5885,10 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/CharSequence;")),
+                        options.itemFactory.stringBuilderType,
+                        options.itemFactory.charSequenceType),
                     options.itemFactory.createString("append")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -5968,10 +5906,10 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/CharSequence;")),
+                        options.itemFactory.stringBuilderType,
+                        options.itemFactory.charSequenceType),
                     options.itemFactory.createString("append")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -5983,10 +5921,10 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/CharSequence;")),
+                        options.itemFactory.stringBuilderType,
+                        options.itemFactory.charSequenceType),
                     options.itemFactory.createString("append")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -5998,9 +5936,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -6028,27 +5965,27 @@
             label0,
             new CfLoad(ValueType.OBJECT, 0),
             new CfIf(If.Type.NE, ValueType.OBJECT, label1),
-            new CfNew(options.itemFactory.createType("Ljava/lang/NullPointerException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/NullPointerException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfConstString(options.itemFactory.createString("delimiter")),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/NullPointerException;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/NullPointerException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 2),
@@ -6057,9 +5994,9 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Iterable;"),
+                    options.itemFactory.createSynthesizedType("Ljava/lang/Iterable;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/util/Iterator;")),
+                        options.itemFactory.createSynthesizedType("Ljava/util/Iterator;")),
                     options.itemFactory.createString("iterator")),
                 true),
             new CfStore(ValueType.OBJECT, 3),
@@ -6068,8 +6005,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("hasNext")),
                 true),
             new CfIf(If.Type.EQ, ValueType.INT, label8),
@@ -6079,19 +6016,18 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("next")),
                 true),
-            new CfCheckCast(options.itemFactory.createType("Ljava/lang/CharSequence;")),
+            new CfCheckCast(options.itemFactory.charSequenceType),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/CharSequence;")),
+                        options.itemFactory.stringBuilderType,
+                        options.itemFactory.charSequenceType),
                     options.itemFactory.createString("append")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -6100,8 +6036,8 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("Z")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.booleanType),
                     options.itemFactory.createString("hasNext")),
                 true),
             new CfIf(If.Type.EQ, ValueType.INT, label8),
@@ -6111,10 +6047,10 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/CharSequence;")),
+                        options.itemFactory.stringBuilderType,
+                        options.itemFactory.charSequenceType),
                     options.itemFactory.createString("append")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -6124,19 +6060,18 @@
             new CfInvoke(
                 185,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/util/Iterator;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/Object;")),
+                    options.itemFactory.createSynthesizedType("Ljava/util/Iterator;"),
+                    options.itemFactory.createProto(options.itemFactory.objectType),
                     options.itemFactory.createString("next")),
                 true),
-            new CfCheckCast(options.itemFactory.createType("Ljava/lang/CharSequence;")),
+            new CfCheckCast(options.itemFactory.charSequenceType),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/CharSequence;")),
+                        options.itemFactory.stringBuilderType,
+                        options.itemFactory.charSequenceType),
                     options.itemFactory.createString("append")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -6146,9 +6081,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -6181,52 +6115,50 @@
             new CfLoad(ValueType.INT, 1),
             new CfIf(If.Type.GE, ValueType.INT, label2),
             label1,
-            new CfNew(options.itemFactory.createType("Ljava/lang/IllegalArgumentException;")),
+            new CfNew(
+                options.itemFactory.createSynthesizedType("Ljava/lang/IllegalArgumentException;")),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("V")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.voidType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfConstString(options.itemFactory.createString("count is negative: ")),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfLoad(ValueType.INT, 1),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.intType),
                     options.itemFactory.createString("append")),
                 false),
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/IllegalArgumentException;"),
+                    options.itemFactory.createSynthesizedType(
+                        "Ljava/lang/IllegalArgumentException;"),
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.voidType, options.itemFactory.stringType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfThrow(),
@@ -6235,8 +6167,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.stringType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 false),
             new CfStore(ValueType.INT, 2),
@@ -6256,7 +6188,7 @@
             new CfLoad(ValueType.OBJECT, 0),
             new CfReturn(ValueType.OBJECT),
             label7,
-            new CfNew(options.itemFactory.createType("Ljava/lang/StringBuilder;")),
+            new CfNew(options.itemFactory.stringBuilderType),
             new CfStackInstruction(CfStackInstruction.Opcode.Dup),
             new CfLoad(ValueType.INT, 2),
             new CfLoad(ValueType.INT, 1),
@@ -6264,9 +6196,9 @@
             new CfInvoke(
                 183,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("V"), options.itemFactory.createType("I")),
+                        options.itemFactory.voidType, options.itemFactory.intType),
                     options.itemFactory.createString("<init>")),
                 false),
             new CfStore(ValueType.OBJECT, 3),
@@ -6283,10 +6215,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
+                    options.itemFactory.stringBuilderType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                        options.itemFactory.stringBuilderType, options.itemFactory.stringType),
                     options.itemFactory.createString("append")),
                 false),
             new CfStackInstruction(CfStackInstruction.Opcode.Pop),
@@ -6298,9 +6229,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/StringBuilder;"),
-                    options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;")),
+                    options.itemFactory.stringBuilderType,
+                    options.itemFactory.createProto(options.itemFactory.stringType),
                     options.itemFactory.createString("toString")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -6339,8 +6269,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.stringType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 false),
             new CfStore(ValueType.INT, 2),
@@ -6354,9 +6284,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("codePointAt")),
                 false),
             new CfStore(ValueType.INT, 3),
@@ -6365,9 +6295,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("I")),
+                        options.itemFactory.booleanType, options.itemFactory.intType),
                     options.itemFactory.createString("isWhitespace")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label6),
@@ -6379,9 +6309,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("charCount")),
                 false),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
@@ -6398,11 +6328,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("Ljava/lang/CharSequence;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.intType,
+                        options.itemFactory.charSequenceType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("codePointBefore")),
                 false),
             new CfStore(ValueType.INT, 3),
@@ -6411,9 +6341,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("I")),
+                        options.itemFactory.booleanType, options.itemFactory.intType),
                     options.itemFactory.createString("isWhitespace")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label12),
@@ -6425,9 +6355,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("charCount")),
                 false),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
@@ -6441,11 +6371,11 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("substring")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -6478,8 +6408,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.stringType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 false),
             new CfStore(ValueType.INT, 2),
@@ -6493,9 +6423,9 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("codePointAt")),
                 false),
             new CfStore(ValueType.INT, 3),
@@ -6504,9 +6434,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("I")),
+                        options.itemFactory.booleanType, options.itemFactory.intType),
                     options.itemFactory.createString("isWhitespace")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label6),
@@ -6518,9 +6448,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("charCount")),
                 false),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, NumericType.INT),
@@ -6534,11 +6464,11 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("substring")),
                 false),
             new CfReturn(ValueType.OBJECT),
@@ -6567,8 +6497,8 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
-                    options.itemFactory.createProto(options.itemFactory.createType("I")),
+                    options.itemFactory.stringType,
+                    options.itemFactory.createProto(options.itemFactory.intType),
                     options.itemFactory.createString("length")),
                 false),
             new CfStore(ValueType.INT, 1),
@@ -6581,11 +6511,11 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("Ljava/lang/CharSequence;"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.intType,
+                        options.itemFactory.charSequenceType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("codePointBefore")),
                 false),
             new CfStore(ValueType.INT, 2),
@@ -6594,9 +6524,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Z"), options.itemFactory.createType("I")),
+                        options.itemFactory.booleanType, options.itemFactory.intType),
                     options.itemFactory.createString("isWhitespace")),
                 false),
             new CfIf(If.Type.NE, ValueType.INT, label5),
@@ -6608,9 +6538,9 @@
             new CfInvoke(
                 184,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/Character;"),
+                    options.itemFactory.boxedCharType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("I"), options.itemFactory.createType("I")),
+                        options.itemFactory.intType, options.itemFactory.intType),
                     options.itemFactory.createString("charCount")),
                 false),
             new CfArithmeticBinop(CfArithmeticBinop.Opcode.Sub, NumericType.INT),
@@ -6624,11 +6554,11 @@
             new CfInvoke(
                 182,
                 options.itemFactory.createMethod(
-                    options.itemFactory.createType("Ljava/lang/String;"),
+                    options.itemFactory.stringType,
                     options.itemFactory.createProto(
-                        options.itemFactory.createType("Ljava/lang/String;"),
-                        options.itemFactory.createType("I"),
-                        options.itemFactory.createType("I")),
+                        options.itemFactory.stringType,
+                        options.itemFactory.intType,
+                        options.itemFactory.intType),
                     options.itemFactory.createString("substring")),
                 false),
             new CfReturn(ValueType.OBJECT),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/CollectionMethodGenerators.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/CollectionMethodGenerators.java
index 9e78a3b..ee175f9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/CollectionMethodGenerators.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/CollectionMethodGenerators.java
@@ -73,7 +73,7 @@
       InternalOptions options, DexMethod method, int formalCount) {
     DexType mapEntryArray =
         options.itemFactory.createArrayType(1, options.itemFactory.mapEntryType);
-    DexType simpleEntry = options.itemFactory.createType("Ljava/util/AbstractMap$SimpleEntry;");
+    DexType simpleEntry = options.itemFactory.abstractMapSimpleEntryType;
     DexMethod simpleEntryConstructor = options.itemFactory.createMethod(
         simpleEntry,
         options.itemFactory.createProto(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 55db2fd..5b695a7 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -25,7 +25,6 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.analysis.equivalence.BasicBlockBehavioralSubsumption;
-import com.android.tools.r8.ir.analysis.type.Nullability;
 import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
 import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
 import com.android.tools.r8.ir.analysis.value.AbstractValue;
@@ -86,7 +85,6 @@
 import com.android.tools.r8.utils.SetUtils;
 import com.google.common.base.Equivalence;
 import com.google.common.base.Equivalence.Wrapper;
-import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
@@ -131,6 +129,7 @@
 import java.util.Set;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 
 public class CodeRewriter {
 
@@ -3113,7 +3112,7 @@
                       dexItemFactory.throwableMethods.initCause,
                       code.createValue(
                           TypeLatticeElement.fromDexType(
-                              dexItemFactory.throwableType, Nullability.maybeNull(), appView)),
+                              dexItemFactory.throwableType, maybeNull(), appView)),
                       initCauseArguments);
               initCause.setPosition(current.getPosition());
               insnIterator.add(initCause);
@@ -3352,8 +3351,8 @@
 
     // Now that the block is split there should not be any catch handlers in the block.
     assert !block.hasCatchHandlers();
-    DexType javaLangSystemType = dexItemFactory.createType("Ljava/lang/System;");
-    DexType javaIoPrintStreamType = dexItemFactory.createType("Ljava/io/PrintStream;");
+    DexType javaLangSystemType = dexItemFactory.javaLangSystemType;
+    DexType javaIoPrintStreamType = dexItemFactory.javaIoPrintStreamType;
     Value out =
         code.createValue(
             TypeLatticeElement.fromDexType(javaIoPrintStreamType, definitelyNotNull(), appView));
@@ -3583,13 +3582,6 @@
 
   // See comment for InternalOptions.canHaveNumberConversionRegisterAllocationBug().
   public void workaroundNumberConversionRegisterAllocationBug(IRCode code) {
-    final Supplier<DexMethod> javaLangDoubleisNaN = Suppliers.memoize(() ->
-     dexItemFactory.createMethod(
-        dexItemFactory.createString("Ljava/lang/Double;"),
-        dexItemFactory.createString("isNaN"),
-        dexItemFactory.booleanDescriptor,
-        new DexString[]{dexItemFactory.doubleDescriptor}));
-
     ListIterator<BasicBlock> blocks = code.listIterator();
     while (blocks.hasNext()) {
       BasicBlock block = blocks.next();
@@ -3607,7 +3599,8 @@
                 && value.definition.isNumberConversion()
                 && value.definition.asNumberConversion().to == NumericType.DOUBLE) {
               InvokeStatic invokeIsNaN =
-                  new InvokeStatic(javaLangDoubleisNaN.get(), null, ImmutableList.of(value));
+                  new InvokeStatic(
+                      dexItemFactory.doubleMethods.isNaN, null, ImmutableList.of(value));
               invokeIsNaN.setPosition(instruction.getPosition());
 
               // Insert the invoke before the current instruction.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
index cf4f72b..2c8e6b9 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
@@ -73,7 +73,7 @@
     DexItemFactory dexItemFactory = appView.dexItemFactory();
     switchMapPrefix = dexItemFactory.createString("$SwitchMap$");
     kotlinSwitchMapPrefix = dexItemFactory.createString("$EnumSwitchMapping$");
-    intArrayType = dexItemFactory.createType("[I");
+    intArrayType = dexItemFactory.intArrayType;
   }
 
   public AppInfoWithLiveness run() {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LogMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LogMethodOptimizer.java
index 6cd36b3..35220c7 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LogMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LogMethodOptimizer.java
@@ -42,7 +42,7 @@
     this.appView = appView;
 
     DexItemFactory dexItemFactory = appView.dexItemFactory();
-    DexType logType = dexItemFactory.createType("Landroid/util/Log;");
+    DexType logType = dexItemFactory.androidUtilLogType;
     this.logType = logType;
     this.isLoggableMethod =
         dexItemFactory.createMethod(
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index dcc6877..85db7d1 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -62,6 +62,8 @@
 /** Encapsulates liveness and reachability information for an application. */
 public class AppInfoWithLiveness extends AppInfoWithSubtyping {
 
+  /** Set of types that are mentioned in the program, but for which no definition exists. */
+  private final Set<DexType> missingTypes;
   /**
    * Set of types that are mentioned in the program. We at least need an empty abstract classitem
    * for these.
@@ -190,6 +192,7 @@
   // TODO(zerny): Clean up the constructors so we have just one.
   AppInfoWithLiveness(
       DirectMappedDexApplication application,
+      Set<DexType> missingTypes,
       Set<DexType> liveTypes,
       Set<DexType> instantiatedAnnotationTypes,
       Set<DexType> instantiatedAppServices,
@@ -230,6 +233,7 @@
       Set<DexType> instantiatedLambdas,
       Set<DexType> constClassReferences) {
     super(application);
+    this.missingTypes = missingTypes;
     this.liveTypes = liveTypes;
     this.instantiatedAnnotationTypes = instantiatedAnnotationTypes;
     this.instantiatedAppServices = instantiatedAppServices;
@@ -273,6 +277,7 @@
 
   public AppInfoWithLiveness(
       AppInfoWithSubtyping appInfoWithSubtyping,
+      Set<DexType> missingTypes,
       Set<DexType> liveTypes,
       Set<DexType> instantiatedAnnotationTypes,
       Set<DexType> instantiatedAppServices,
@@ -313,6 +318,7 @@
       Set<DexType> instantiatedLambdas,
       Set<DexType> constClassReferences) {
     super(appInfoWithSubtyping);
+    this.missingTypes = missingTypes;
     this.liveTypes = liveTypes;
     this.instantiatedAnnotationTypes = instantiatedAnnotationTypes;
     this.instantiatedAppServices = instantiatedAppServices;
@@ -357,6 +363,7 @@
   private AppInfoWithLiveness(AppInfoWithLiveness previous) {
     this(
         previous,
+        previous.missingTypes,
         previous.liveTypes,
         previous.instantiatedAnnotationTypes,
         previous.instantiatedAppServices,
@@ -406,6 +413,7 @@
       Collection<DexReference> additionalPinnedItems) {
     this(
         application,
+        previous.missingTypes,
         previous.liveTypes,
         previous.instantiatedAnnotationTypes,
         previous.instantiatedAppServices,
@@ -458,6 +466,7 @@
       Map<DexField, Int2ReferenceMap<DexField>> switchMaps,
       Map<DexType, Map<DexField, EnumValueInfo>> enumValueInfoMaps) {
     super(previous);
+    this.missingTypes = previous.missingTypes;
     this.liveTypes = previous.liveTypes;
     this.instantiatedAnnotationTypes = previous.instantiatedAnnotationTypes;
     this.instantiatedAppServices = previous.instantiatedAppServices;
@@ -500,6 +509,26 @@
     previous.markObsolete();
   }
 
+  private boolean dontAssertDefinitionFor = true;
+
+  @Override
+  public void enableDefinitionForAssert() {
+    dontAssertDefinitionFor = false;
+  }
+
+  @Override
+  public void disableDefinitionForAssert() {
+    dontAssertDefinitionFor = true;
+  }
+
+  @Override
+  public DexClass definitionFor(DexType type) {
+    DexClass definition = super.definitionFor(type);
+    assert dontAssertDefinitionFor || definition != null || missingTypes.contains(type)
+        : "Failed lookup of non-missing type: " + type;
+    return definition;
+  }
+
   public boolean isLiveProgramClass(DexProgramClass clazz) {
     return liveTypes.contains(clazz.type);
   }
@@ -966,6 +995,7 @@
 
     return new AppInfoWithLiveness(
         application,
+        missingTypes,
         rewriteItems(liveTypes, lens::lookupType),
         rewriteItems(instantiatedAnnotationTypes, lens::lookupType),
         rewriteItems(instantiatedAppServices, lens::lookupType),
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index ba1bdb5..04f10d9 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -46,8 +46,10 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
+import com.android.tools.r8.graph.DirectMappedDexApplication.Builder;
 import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl;
 import com.android.tools.r8.graph.FieldAccessInfoImpl;
+import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.graph.KeyedDexItem;
 import com.android.tools.r8.graph.PresortedComparable;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -203,9 +205,16 @@
   /** Set of types whose class initializer may execute. */
   private final SetWithReportedReason<DexProgramClass> initializedTypes;
 
-  /** Set of live types defined in the library and classpath. Used to avoid duplicate tracing. */
+  /**
+   * Set of live types defined in the library and classpath.
+   *
+   * <p>Used to build a new app of just referenced types and avoid duplicate tracing.
+   */
   private final Set<DexClass> liveNonProgramTypes = Sets.newIdentityHashSet();
 
+  /** Set of missing types. */
+  private final Set<DexType> missingTypes = Sets.newIdentityHashSet();
+
   /** Mapping from each unused interface to the set of live types that implements the interface. */
   private final Map<DexProgramClass, Set<DexProgramClass>> unusedInterfaceTypes =
       new IdentityHashMap<>();
@@ -409,11 +418,14 @@
         return clazz.asProgramClass();
       }
       if (liveNonProgramTypes.add(clazz) && clazz.isLibraryClass()) {
+        // TODO(b/149201735): This likely needs to apply to classpath too.
         ensureMethodsContinueToWidenAccess(clazz);
+        // TODO(b/149201158): This should apply to classpath too (likely even hard fail).
         warnIfLibraryTypeInheritsFromProgramType(clazz.asLibraryClass());
       }
+    } else {
+      reportMissingClass(type);
     }
-    reportMissingClass(type);
     return null;
   }
 
@@ -582,7 +594,7 @@
       DexField field, DexEncodedMethod context, boolean isRead, boolean isReflective) {
     FieldAccessInfoImpl info = fieldAccessInfoCollection.get(field);
     if (info == null) {
-      DexEncodedField encodedField = appInfo.resolveField(field);
+      DexEncodedField encodedField = resolveField(field);
 
       // If the field does not exist, then record this in the mapping, such that we don't have to
       // resolve the field the next time.
@@ -979,9 +991,8 @@
     // Must mark the field as targeted even if it does not exist.
     markFieldAsTargeted(field, currentMethod);
 
-    DexEncodedField encodedField = appInfo.resolveField(field);
+    DexEncodedField encodedField = resolveField(field);
     if (encodedField == null) {
-      reportMissingField(field);
       return false;
     }
 
@@ -1016,9 +1027,8 @@
     // Must mark the field as targeted even if it does not exist.
     markFieldAsTargeted(field, currentMethod);
 
-    DexEncodedField encodedField = appInfo.resolveField(field);
+    DexEncodedField encodedField = resolveField(field);
     if (encodedField == null) {
-      reportMissingField(field);
       return false;
     }
 
@@ -1050,11 +1060,10 @@
       return false;
     }
 
-    DexEncodedField encodedField = appInfo.resolveField(field);
+    DexEncodedField encodedField = resolveField(field);
     if (encodedField == null) {
       // Must mark the field as targeted even if it does not exist.
       markFieldAsTargeted(field, currentMethod);
-      reportMissingField(field);
       return false;
     }
 
@@ -1095,11 +1104,10 @@
       return false;
     }
 
-    DexEncodedField encodedField = appInfo.resolveField(field);
+    DexEncodedField encodedField = resolveField(field);
     if (encodedField == null) {
       // Must mark the field as targeted even if it does not exist.
       markFieldAsTargeted(field, currentMethod);
-      reportMissingField(field);
       return false;
     }
 
@@ -1227,6 +1235,13 @@
       return;
     }
 
+    // Mark types in inner-class attributes referenced.
+    InnerClassAttribute innerClassAttributes = holder.getInnerClassAttributeForThisClass();
+    if (innerClassAttributes != null) {
+      recordTypeReference(innerClassAttributes.getInner());
+      recordTypeReference(innerClassAttributes.getOuter());
+    }
+
     if (Log.ENABLED) {
       Log.verbose(getClass(), "Type `%s` has become live.", holder.type);
     }
@@ -1348,6 +1363,7 @@
   private void handleAnnotation(DexDefinition holder, DexAnnotation annotation) {
     assert !holder.isDexClass() || holder.asDexClass().isProgramClass();
     DexType type = annotation.annotation.type;
+    recordTypeReference(type);
     DexClass clazz = appView.definitionFor(type);
     boolean annotationTypeIsLibraryClass = clazz == null || clazz.isNotProgramClass();
     boolean isLive = annotationTypeIsLibraryClass || liveTypes.contains(clazz.asProgramClass());
@@ -1365,7 +1381,25 @@
     annotation.annotation.collectIndexedItems(referenceMarker);
   }
 
+  private DexEncodedField resolveField(DexField field) {
+    // Record the references in case they are not program types.
+    recordTypeReference(field.holder);
+    recordTypeReference(field.type);
+    DexEncodedField encodedField = appInfo.resolveField(field);
+    if (encodedField == null) {
+      reportMissingField(field);
+      return null;
+    }
+    return encodedField;
+  }
+
   private ResolutionResult resolveMethod(DexMethod method, KeepReason reason) {
+    // Record the references in case they are not program types.
+    recordTypeReference(method.holder);
+    recordTypeReference(method.proto.returnType);
+    for (DexType param : method.proto.parameters.values) {
+      recordTypeReference(param);
+    }
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     if (resolutionResult.isFailedResolution()) {
       reportMissingMethod(method);
@@ -1436,6 +1470,10 @@
     DexType holder = method.holder;
     DexProgramClass clazz = getProgramClassOrNull(holder);
     if (clazz == null) {
+      recordTypeReference(method.proto.returnType);
+      for (DexType param : method.proto.parameters.values) {
+        recordTypeReference(param);
+      }
       return;
     }
     // TODO(zerny): Is it ok that we lookup in both the direct and virtual pool here?
@@ -1496,7 +1534,8 @@
   }
 
   private void reportMissingClass(DexType clazz) {
-    if (Log.ENABLED && reportedMissing.add(clazz)) {
+    boolean newReport = missingTypes.add(clazz);
+    if (Log.ENABLED && newReport) {
       Log.verbose(Enqueuer.class, "Class `%s` is missing.", clazz);
     }
   }
@@ -2008,6 +2047,19 @@
     }
   }
 
+  private void recordTypeReference(DexType type) {
+    if (type == null) {
+      return;
+    }
+    if (type.isArrayType()) {
+      type = type.toBaseType(appView.dexItemFactory());
+    }
+    if (!type.isClassType()) {
+      return;
+    }
+    getProgramClassOrNull(type);
+  }
+
   private void markVirtualMethodAsReachable(
       DexMethod method, boolean interfaceInvoke, ProgramMethod contextOrNull, KeepReason reason) {
     if (method.holder.isArrayType()) {
@@ -2024,6 +2076,12 @@
     // TODO(b/70160030): Revise this to support tree shaking library methods on non-escaping types.
     DexProgramClass holder = getProgramClassOrNull(method.holder);
     if (holder == null) {
+      // TODO: clean this.
+      // Ensure that the full proto of the targeted method is referenced.
+      recordTypeReference(method.proto.returnType);
+      for (DexType type : method.proto.parameters.values) {
+        recordTypeReference(type);
+      }
       return;
     }
 
@@ -2330,9 +2388,39 @@
       liveMethods.add(bridge.holder, bridge.method, graphReporter.fakeReportShouldNotBeUsed());
     }
 
-    // A direct appInfo is required to add classpath classes in wrapper post processing.
-    assert appInfo.app().isDirect() : "Expected a direct appInfo after enqueuing.";
-    DirectMappedDexApplication.Builder appBuilder = appInfo.app().asDirect().builder();
+    // Ensure references from various root set collections.
+    rootSet
+        .noSideEffects
+        .keySet()
+        .forEach(
+            r -> {
+              if (r.isDexType()) {
+                recordTypeReference(r.asDexType());
+              } else if (r.isDexField()) {
+                recordTypeReference(r.asDexField().holder);
+                recordTypeReference(r.asDexField().type);
+              } else {
+                assert r.isDexMethod();
+                recordTypeReference(r.asDexMethod().holder);
+                recordTypeReference(r.asDexMethod().proto.returnType);
+                for (DexType param : r.asDexMethod().proto.parameters.values) {
+                  recordTypeReference(param);
+                }
+              }
+            });
+
+    // Rebuild a new app only containing referenced types.
+    appView.dexItemFactory().forEachPossiblyCompilerSynthesizedType(this::recordTypeReference);
+    Set<DexLibraryClass> libraryClasses = Sets.newIdentityHashSet();
+    Set<DexClasspathClass> classpathClasses = Sets.newIdentityHashSet();
+    for (DexClass clazz : liveNonProgramTypes) {
+      traverseHierarchy(clazz, libraryClasses, classpathClasses);
+    }
+    Builder appBuilder = appInfo.app().asDirect().builder();
+    appBuilder.replaceLibraryClasses(libraryClasses);
+    appBuilder.replaceClasspathClasses(classpathClasses);
+    // Can't replace the program classes at this point as they are needed in tree pruning.
+    // Post process the app to add synthetic content.
     postProcessLambdaDesugaring(appBuilder);
     postProcessLibraryConversionWrappers(appBuilder);
     DirectMappedDexApplication app = appBuilder.build();
@@ -2340,6 +2428,7 @@
     AppInfoWithLiveness appInfoWithLiveness =
         new AppInfoWithLiveness(
             app,
+            missingTypes,
             SetUtils.mapIdentityHashSet(liveTypes.getItems(), DexProgramClass::getType),
             SetUtils.mapIdentityHashSet(
                 liveAnnotations.getItems(), DexAnnotation::getAnnotationType),
@@ -2388,6 +2477,43 @@
     return appInfoWithLiveness;
   }
 
+  private void traverseHierarchy(
+      DexClass clazz,
+      Set<DexLibraryClass> libraryClasses,
+      Set<DexClasspathClass> classpathClasses) {
+    if (clazz.isLibraryClass()) {
+      libraryClasses.add(clazz.asLibraryClass());
+    } else if (clazz.isClasspathClass()) {
+      classpathClasses.add(clazz.asClasspathClass());
+    }
+    Deque<DexType> worklist = new ArrayDeque<>();
+    if (clazz.superType != null) {
+      worklist.add(clazz.superType);
+    }
+    Collections.addAll(worklist, clazz.interfaces.values);
+    while (!worklist.isEmpty()) {
+      DexType type = worklist.pop();
+      DexClass definition = appView.definitionFor(type);
+      if (definition.isProgramClass()) {
+        // TODO(b/120884788): This should assert not possible once fixed.
+        continue;
+      }
+      if (definition.isLibraryClass()) {
+        if (!libraryClasses.add(definition.asLibraryClass())) {
+          continue;
+        }
+      } else if (definition.isClasspathClass()) {
+        if (!classpathClasses.add(definition.asClasspathClass())) {
+          continue;
+        }
+      }
+      if (definition.superType != null) {
+        worklist.add(definition.superType);
+      }
+      Collections.addAll(worklist, definition.interfaces.values);
+    }
+  }
+
   private void postProcessLibraryConversionWrappers(DirectMappedDexApplication.Builder appBuilder) {
     if (desugaredLibraryWrapperAnalysis == null) {
       return;
@@ -3428,6 +3554,8 @@
 
     @Override
     public boolean addField(DexField field) {
+      recordTypeReference(field.holder);
+      recordTypeReference(field.type);
       DexClass holder = appView.definitionFor(field.holder);
       if (holder == null) {
         return false;
@@ -3462,6 +3590,11 @@
 
     @Override
     public boolean addMethod(DexMethod method) {
+      // Record the references in case they are not program types.
+      recordTypeReference(method.proto.returnType);
+      for (DexType param : method.proto.parameters.values) {
+        recordTypeReference(param);
+      }
       DexProgramClass holder = getProgramClassOrNull(method.holder);
       if (holder == null) {
         return false;
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
index 718b9a9..b92f82e 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.shaking;
 
 import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexClass;
@@ -13,7 +14,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
 import com.android.tools.r8.utils.SetUtils;
-import com.google.common.collect.Maps;
+import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Set;
 
@@ -32,16 +33,7 @@
   private final DirectMappedDexApplication dexApplication;
   private final MainDexClasses.Builder mainDexClassesBuilder;
 
-  /**
-   * @param roots Classes which code may be executed before secondary dex files loading.
-   * @param application the dex appplication.
-   */
-  public MainDexListBuilder(Set<DexProgramClass> roots, DirectMappedDexApplication application) {
-    this.dexApplication = application;
-    this.appInfo = new AppInfoWithSubtyping(dexApplication);
-    // Only consider program classes for the root set.
-    this.roots = SetUtils.mapIdentityHashSet(roots, DexProgramClass::getType);
-    mainDexClassesBuilder = MainDexClasses.builder(appInfo).addRoots(this.roots);
+  public static void checkForAssumedLibraryTypes(AppInfo appInfo) {
     DexClass enumType = appInfo.definitionFor(appInfo.dexItemFactory().enumType);
     if (enumType == null) {
       throw new CompilationError("Tracing for legacy multi dex is not possible without all"
@@ -52,9 +44,19 @@
       throw new CompilationError("Tracing for legacy multi dex is not possible without all"
           + " classpath libraries (java.lang.annotation.Annotation is missing)");
     }
-    annotationTypeContainEnum =
-        Maps.newHashMapWithExpectedSize(
-            appInfo.subtypes(appInfo.dexItemFactory().annotationType).size());
+  }
+
+  /**
+   * @param roots Classes which code may be executed before secondary dex files loading.
+   * @param application the dex appplication.
+   */
+  public MainDexListBuilder(Set<DexProgramClass> roots, DirectMappedDexApplication application) {
+    this.dexApplication = application;
+    this.appInfo = new AppInfoWithSubtyping(dexApplication);
+    // Only consider program classes for the root set.
+    this.roots = SetUtils.mapIdentityHashSet(roots, DexProgramClass::getType);
+    mainDexClassesBuilder = MainDexClasses.builder(appInfo).addRoots(this.roots);
+    annotationTypeContainEnum = new IdentityHashMap<>();
   }
 
   public MainDexClasses run() {
@@ -126,11 +128,6 @@
     return appInfo.isSubtype(valueType, appInfo.dexItemFactory().annotationType);
   }
 
-  private boolean isProgramClass(DexType dexType) {
-    DexClass clazz = appInfo.definitionFor(dexType);
-    return clazz != null && clazz.isProgramClass();
-  }
-
   private void traceMainDexDirectDependencies() {
     new MainDexDirectReferenceTracer(appInfo, this::addDirectDependency)
         .run(roots);
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
index c5dcb0c..f75a307 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
@@ -105,7 +105,7 @@
         .setClassType(ProguardClassType.CLASS)
         .setClassNames(
             ProguardClassNameList.singletonList(
-                ProguardTypeMatcher.create(factory.createType("Landroid/os/Build$VERSION;"))))
+                ProguardTypeMatcher.create(factory.androidOsBuildVersionType)))
         .setMemberRules(
             ImmutableList.of(
                 ProguardMemberRule.builder()
@@ -138,7 +138,7 @@
           && !rule.getInheritanceClassName().matches(factory.objectType)) {
         continue;
       }
-      if (!rule.getClassNames().matches(factory.createType("Landroid/os/Build$VERSION;"))) {
+      if (!rule.getClassNames().matches(factory.androidOsBuildVersionType)) {
         continue;
       }
       for (ProguardMemberRule memberRule : rule.getMemberRules()) {
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLibraryMemberRenamingTests.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLibraryMemberRenamingTests.java
index 0e5e1c6..26873f4 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLibraryMemberRenamingTests.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLibraryMemberRenamingTests.java
@@ -63,7 +63,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withAllRuntimes().build();
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
   }
 
   public ApplyMappingLibraryMemberRenamingTests(TestParameters parameters) {
@@ -78,7 +78,7 @@
             .addProgramClasses(Dto.class, Interface.class, Main.class)
             .addKeepClassAndMembersRules(Main.class)
             .addKeepClassAndMembersRulesWithAllowObfuscation(Interface.class, Dto.class)
-            .setMinApi(parameters.getRuntime())
+            .setMinApi(parameters.getApiLevel())
             .compile()
             .inspect(
                 codeInspector -> {
@@ -93,7 +93,7 @@
         .addClasspathClasses(Dto.class, Interface.class, Main.class)
         .addKeepAllClassesRule()
         .addApplyMapping(libraryCompileResult.getProguardMap())
-        .setMinApi(parameters.getRuntime())
+        .setMinApi(parameters.getApiLevel())
         .compile()
         .addRunClasspathFiles(libraryCompileResult.writeToZip())
         .run(parameters.getRuntime(), ClientTest.class)
diff --git a/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
index 8034ad7..079a8f5 100644
--- a/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
@@ -44,7 +44,7 @@
         factory.createType(DescriptorUtils.javaTypeToDescriptor(Foo.class.getTypeName()));
     DexType[] arrayTypes =
         new DexType[] {
-          factory.createType("[I"),
+          factory.intArrayType,
           factory.stringArrayType,
           factory.objectArrayType,
           factory.createArrayType(2, fooType)
diff --git a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java
index 725fe66..3971997 100644
--- a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java
+++ b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java
@@ -31,7 +31,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withAllRuntimes().build();
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
   }
 
   private final TestParameters parameters;
@@ -46,7 +46,7 @@
         .addProgramClasses(TestClass.class)
         .addKeepMainRule(TestClass.class)
         .addKeepRules("-addconfigurationdebugging")
-        .setMinApi(parameters.getRuntime())
+        .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), TestClass.class)
         .assertSuccessWithOutput(StringUtils.lines("false"));
   }
diff --git a/tools/test.py b/tools/test.py
index 9359394..a75beb4 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -237,6 +237,7 @@
     gradle_args.append('-Pr8lib_no_deps')
   if options.worktree:
     gradle_args.append('-g=' + os.path.join(utils.REPO_ROOT, ".gradle_user_home"))
+    gradle_args.append('--no-daemon')
 
   # Build an R8 with dependencies for bootstrapping tests before adding test sources.
   gradle_args.append('r8WithRelocatedDeps')