diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 06f5379..43868c3 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -17,8 +17,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.graph.LazyLoadedDexApplication;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis;
@@ -280,7 +278,7 @@
 
       if (options.isGeneratingClassFiles()) {
         finalizeApplication(appView, executor);
-        new CfApplicationWriter(appView, marker, GraphLens.getIdentityLens(), namingLens)
+        new CfApplicationWriter(appView, marker, namingLens)
             .write(options.getClassFileConsumer(), inputApp);
       } else {
         if (!hasDexResources || !hasClassResources || !appView.typeRewriter.isRewriting()) {
@@ -332,8 +330,6 @@
         new ApplicationWriter(
                 appView,
                 marker == null ? null : ImmutableList.copyOf(markers),
-                appView.graphLens(),
-                InitClassLens.getThrowingInstance(),
                 namingLens)
             .write(executor, inputApp);
       }
@@ -393,8 +389,6 @@
     new ApplicationWriter(
             appView,
             null,
-            GraphLens.getIdentityLens(),
-            InitClassLens.getThrowingInstance(),
             desugaringLens,
             convertedCfFiles)
         .write(executor);
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
index d8e8e69..a31f3f7 100644
--- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
+++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -13,8 +13,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.ExceptionUtils;
@@ -105,8 +103,6 @@
             new ApplicationWriter(
                 appView,
                 markers,
-                GraphLens.getIdentityLens(),
-                InitClassLens.getThrowingInstance(),
                 NamingLens.getIdentityLens());
         writer.write(executor);
         options.printWarnings();
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
index fdcdaf2..a7ac9e3 100644
--- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java
+++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -14,8 +14,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.graph.LazyLoadedDexApplication;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.NamingLens;
@@ -112,8 +110,6 @@
           new ApplicationWriter(
                   appView,
                   markers,
-                  GraphLens.getIdentityLens(),
-                  InitClassLens.getThrowingInstance(),
                   NamingLens.getIdentityLens(),
                   consumer)
               .write(executor);
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
index dde847a..303b540 100644
--- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -30,7 +30,6 @@
 import com.android.tools.r8.graph.FieldAccessFlags;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
 import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
-import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.LazyLoadedDexApplication;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
@@ -349,7 +348,6 @@
         new CfApplicationWriter(
             appView,
             options.getMarker(Tool.L8),
-            GraphLens.getIdentityLens(),
             NamingLens.getIdentityLens());
     ClassFileConsumer consumer =
         new ClassFileConsumer.ArchiveConsumer(
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java
index 430d811..48e8729 100644
--- a/src/main/java/com/android/tools/r8/L8.java
+++ b/src/main/java/com/android/tools/r8/L8.java
@@ -146,7 +146,7 @@
       NamingLens namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView);
       new GenericSignatureRewriter(appView, namingLens).run(appView.appInfo().classes(), executor);
 
-      new CfApplicationWriter(appView, options.getMarker(Tool.L8), appView.graphLens(), namingLens)
+      new CfApplicationWriter(appView, options.getMarker(Tool.L8), namingLens)
           .write(options.getClassFileConsumer());
       options.printWarnings();
     } catch (ExecutionException e) {
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 7d177cd..885ada8 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -36,7 +36,6 @@
 import com.android.tools.r8.graph.GenericSignatureContextBuilder;
 import com.android.tools.r8.graph.GenericSignatureCorrectnessHelper;
 import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.graph.PrunedItems;
 import com.android.tools.r8.graph.SubtypingInfo;
@@ -212,8 +211,6 @@
   static void writeApplication(
       ExecutorService executorService,
       AppView<?> appView,
-      GraphLens graphLens,
-      InitClassLens initClassLens,
       NamingLens namingLens,
       InternalOptions options,
       AndroidApp inputApp)
@@ -227,15 +224,13 @@
       Set<Marker> markers = new HashSet<>(options.itemFactory.extractMarkers());
       markers.remove(marker);
       if (options.isGeneratingClassFiles()) {
-        new CfApplicationWriter(appView, marker, graphLens, namingLens)
+        new CfApplicationWriter(appView, marker, namingLens)
             .write(options.getClassFileConsumer(), inputApp);
       } else {
         new ApplicationWriter(
                 appView,
                 // Ensure that the marker for this compilation is the first in the list.
                 ImmutableList.<Marker>builder().add(marker).addAll(markers).build(),
-                graphLens,
-                initClassLens,
                 namingLens)
             .write(executorService, inputApp);
       }
@@ -844,8 +839,6 @@
       writeApplication(
           executorService,
           appView,
-          appView.graphLens(),
-          appView.initClassLens(),
           namingLens,
           options,
           inputApp);
diff --git a/src/main/java/com/android/tools/r8/bisect/Bisect.java b/src/main/java/com/android/tools/r8/bisect/Bisect.java
index 262300f..d9dd999 100644
--- a/src/main/java/com/android/tools/r8/bisect/Bisect.java
+++ b/src/main/java/com/android/tools/r8/bisect/Bisect.java
@@ -14,8 +14,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -192,8 +190,6 @@
         new ApplicationWriter(
             AppView.createForD8(AppInfo.createInitialAppInfo(app)),
             null,
-            GraphLens.getIdentityLens(),
-            InitClassLens.getThrowingInstance(),
             NamingLens.getIdentityLens());
     writer.write(executor);
     options.signalFinishedToConsumers();
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 58748cd..3bb7190 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -39,8 +39,6 @@
 import com.android.tools.r8.graph.DexValue;
 import com.android.tools.r8.graph.DexWritableCode;
 import com.android.tools.r8.graph.EnclosingMethodAttribute;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ParameterAnnotationsList;
@@ -81,8 +79,6 @@
 public class ApplicationWriter {
 
   public final AppView<?> appView;
-  public final GraphLens graphLens;
-  public final InitClassLens initClassLens;
   public final NamingLens namingLens;
   public final InternalOptions options;
   private final CodeToKeep desugaredLibraryCodeToKeep;
@@ -158,14 +154,10 @@
   public ApplicationWriter(
       AppView<?> appView,
       List<Marker> markers,
-      GraphLens graphLens,
-      InitClassLens initClassLens,
       NamingLens namingLens) {
     this(
         appView,
         markers,
-        graphLens,
-        initClassLens,
         namingLens,
         null);
   }
@@ -173,16 +165,12 @@
   public ApplicationWriter(
       AppView<?> appView,
       List<Marker> markers,
-      GraphLens graphLens,
-      InitClassLens initClassLens,
       NamingLens namingLens,
       DexIndexedConsumer consumer) {
     this.appView = appView;
     this.options = appView.options();
     this.desugaredLibraryCodeToKeep = CodeToKeep.createCodeToKeep(options, namingLens);
     this.markers = markers;
-    this.graphLens = graphLens;
-    this.initClassLens = initClassLens;
     this.namingLens = namingLens;
     this.programConsumer = consumer;
     this.isTypeMissing =
@@ -297,7 +285,8 @@
                   Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options);
                   computeOffsetMappingAndRewriteJumboStrings(
                       virtualFile, lazyDexStrings, fileTiming);
-                  DebugRepresentation.computeForFile(virtualFile, graphLens, namingLens, options);
+                  DebugRepresentation.computeForFile(
+                      virtualFile, appView.graphLens(), namingLens, options);
                   fileTiming.end();
                   return fileTiming;
                 },
@@ -351,7 +340,7 @@
       // Fail if there are pending errors, e.g., the program consumers may have reported errors.
       options.reporter.failIfPendingErrors();
       // Supply info to all additional resource consumers.
-      supplyAdditionalConsumers(appView.appInfo().app(), appView, graphLens, namingLens, options);
+      supplyAdditionalConsumers(appView.appInfo().app(), appView, namingLens, options);
     } finally {
       timing.end();
     }
@@ -455,8 +444,7 @@
       return;
     }
     timing.begin("Compute object offset mapping");
-    virtualFile.computeMapping(
-        appView, graphLens, namingLens, initClassLens, lazyDexStrings.size(), timing);
+    virtualFile.computeMapping(appView, namingLens, lazyDexStrings.size(), timing);
     timing.end();
     timing.begin("Rewrite jumbo strings");
     rewriteCodeWithJumboStrings(
@@ -521,7 +509,6 @@
   public static void supplyAdditionalConsumers(
       DexApplication application,
       AppView<?> appView,
-      GraphLens graphLens,
       NamingLens namingLens,
       InternalOptions options) {
     if (options.configurationConsumer != null) {
@@ -540,7 +527,7 @@
     if (dataResourceConsumer != null) {
       ImmutableList<DataResourceProvider> dataResourceProviders = application.dataResourceProviders;
       ResourceAdapter resourceAdapter =
-          new ResourceAdapter(appView, application.dexItemFactory, graphLens, namingLens, options);
+          new ResourceAdapter(appView, application.dexItemFactory, namingLens, options);
 
       adaptAndPassDataResources(
           options, dataResourceConsumer, dataResourceProviders, resourceAdapter);
@@ -575,8 +562,7 @@
       for (DataResourceProvidersAndConsumer entry :
           options.featureSplitConfiguration.getDataResourceProvidersAndConsumers()) {
         ResourceAdapter resourceAdapter =
-            new ResourceAdapter(
-                appView, application.dexItemFactory, graphLens, namingLens, options);
+            new ResourceAdapter(appView, application.dexItemFactory, namingLens, options);
         adaptAndPassDataResources(
             options, entry.getConsumer(), entry.getProviders(), resourceAdapter);
       }
diff --git a/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java b/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java
index 1183590..92671f2 100644
--- a/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java
+++ b/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java
@@ -10,8 +10,6 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.google.common.collect.Maps;
@@ -71,7 +69,7 @@
 
     public void updateNumbersOfIds() {
       // Use a temporary VirtualFile to evaluate the number of ids in the group.
-      VirtualFile virtualFile = new VirtualFile(0, appView, graphLens, initClassLens, namingLens);
+      VirtualFile virtualFile = new VirtualFile(0, appView, namingLens);
       // Note: sort not needed.
       for (DexProgramClass clazz : members) {
         virtualFile.addClass(clazz);
@@ -285,9 +283,7 @@
   private final BitSet fullDex = new BitSet();
   private final Set<DexProgramClass> classes;
   private final AppView<?> appView;
-  private int dexIndexOffset;
-  private final GraphLens graphLens;
-  private final InitClassLens initClassLens;
+  private final int dexIndexOffset;
   private final NamingLens namingLens;
   private final DirectSubClassesInfo directSubClasses;
 
@@ -296,8 +292,6 @@
       List<VirtualFile> dexes,
       Set<DexProgramClass> classes,
       int dexIndexOffset,
-      GraphLens graphLens,
-      InitClassLens initClassLens,
       NamingLens namingLens,
       AppView<?> appView,
       ExecutorService executorService) {
@@ -305,8 +299,6 @@
     this.dexes = dexes;
     this.classes = classes;
     this.dexIndexOffset = dexIndexOffset;
-    this.graphLens = graphLens;
-    this.initClassLens = initClassLens;
     this.namingLens = namingLens;
     this.appView = appView;
     this.executorService = executorService;
@@ -378,8 +370,7 @@
   }
 
   private Collection<VirtualFile> assignGroup(ClassGroup group, List<VirtualFile> exclude) {
-    VirtualFileCycler cycler =
-        new VirtualFileCycler(dexes, appView, graphLens, initClassLens, namingLens, dexIndexOffset);
+    VirtualFileCycler cycler = new VirtualFileCycler(dexes, appView, namingLens, dexIndexOffset);
     if (group.members.isEmpty()) {
       return Collections.emptyList();
     } else if (group.canFitInOneDex()) {
@@ -428,8 +419,7 @@
     Collections.sort(layers);
 
     Collection<VirtualFile> usedDex = new ArrayList<>();
-    VirtualFileCycler cycler =
-        new VirtualFileCycler(dexes, appView, graphLens, initClassLens, namingLens, dexIndexOffset);
+    VirtualFileCycler cycler = new VirtualFileCycler(dexes, appView, namingLens, dexIndexOffset);
     // Don't modify exclude. Think about modifying the input collection considering this
     // is private API.
     Set<VirtualFile> currentExclude = new HashSet<>(exclude);
diff --git a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
index 29987e7..eaf736d 100644
--- a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
+++ b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
@@ -40,12 +40,11 @@
   public ResourceAdapter(
       AppView<?> appView,
       DexItemFactory dexItemFactory,
-      GraphLens graphLens,
       NamingLens namingLens,
       InternalOptions options) {
     this.appView = appView;
     this.dexItemFactory = dexItemFactory;
-    this.graphLens = graphLens;
+    this.graphLens = appView.graphLens();
     this.namingLens = namingLens;
     this.options = options;
   }
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index a085223..7d88ac7 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -79,44 +79,35 @@
   VirtualFile(
       int id,
       AppView<?> appView,
-      GraphLens graphLens,
-      InitClassLens initClassLens,
       NamingLens namingLens) {
-    this(id, appView, graphLens, initClassLens, namingLens, null, null);
+    this(id, appView, namingLens, null, null);
   }
 
   VirtualFile(
       int id,
       AppView<?> appView,
-      GraphLens graphLens,
-      InitClassLens initClassLens,
       NamingLens namingLens,
       FeatureSplit featureSplit) {
-    this(id, appView, graphLens, initClassLens, namingLens, null, featureSplit);
+    this(id, appView, namingLens, null, featureSplit);
   }
 
   private VirtualFile(
       int id,
       AppView<?> appView,
-      GraphLens graphLens,
-      InitClassLens initClassLens,
       NamingLens namingLens,
       DexProgramClass primaryClass) {
-    this(id, appView, graphLens, initClassLens, namingLens, primaryClass, null);
+    this(id, appView, namingLens, primaryClass, null);
   }
 
   private VirtualFile(
       int id,
       AppView<?> appView,
-      GraphLens graphLens,
-      InitClassLens initClassLens,
       NamingLens namingLens,
       DexProgramClass primaryClass,
       FeatureSplit featureSplit) {
     this.id = id;
-    this.indexedItems = new VirtualFileIndexedItemCollection(graphLens, initClassLens, namingLens);
-    this.transaction =
-        new IndexedItemTransaction(indexedItems, appView, graphLens, initClassLens, namingLens);
+    this.indexedItems = new VirtualFileIndexedItemCollection(appView, namingLens);
+    this.transaction = new IndexedItemTransaction(indexedItems, appView, namingLens);
     this.primaryClass = primaryClass;
     this.featureSplit = featureSplit;
   }
@@ -221,9 +212,7 @@
 
   public void computeMapping(
       AppView<?> appView,
-      GraphLens graphLens,
       NamingLens namingLens,
-      InitClassLens initClassLens,
       int lazyDexStringsCount,
       Timing timing) {
     assert transaction.isEmpty();
@@ -231,9 +220,7 @@
     objectMapping =
         new ObjectToOffsetMapping(
             appView,
-            graphLens,
             namingLens,
-            initClassLens,
             transaction.rewriter,
             indexedItems.classes,
             indexedItems.protos,
@@ -351,8 +338,6 @@
               new VirtualFile(
                   virtualFiles.size(),
                   writer.appView,
-                  writer.graphLens,
-                  writer.initClassLens,
                   writer.namingLens,
                   clazz);
           virtualFiles.add(file);
@@ -390,9 +375,7 @@
       this.options = options;
 
       // Create the primary dex file. The distribution will add more if needed.
-      mainDexFile =
-          new VirtualFile(
-              0, writer.appView, writer.graphLens, writer.initClassLens, writer.namingLens);
+      mainDexFile = new VirtualFile(0, writer.appView, writer.namingLens);
       assert virtualFiles.isEmpty();
       virtualFiles.add(mainDexFile);
       addMarkers(mainDexFile);
@@ -506,8 +489,6 @@
             new VirtualFile(
                 0,
                 writer.appView,
-                writer.graphLens,
-                writer.initClassLens,
                 writer.namingLens,
                 featureSplitSetEntry.getKey());
         virtualFiles.add(featureFile);
@@ -522,8 +503,6 @@
                 featureClasses,
                 originalNames,
                 0,
-                writer.graphLens,
-                writer.initClassLens,
                 writer.namingLens,
                 options)
             .call();
@@ -557,9 +536,7 @@
         assert !virtualFiles.get(0).isEmpty();
         assert virtualFiles.size() == 1;
         // The main dex file is filtered out, so ensure at least one file for the remaining classes.
-        virtualFiles.add(
-            new VirtualFile(
-                1, writer.appView, writer.graphLens, writer.initClassLens, writer.namingLens));
+        virtualFiles.add(new VirtualFile(1, writer.appView, writer.namingLens));
         filesForDistribution = virtualFiles.subList(1, virtualFiles.size());
         fileIndexOffset = 1;
       }
@@ -573,8 +550,6 @@
                 filesForDistribution,
                 classes,
                 fileIndexOffset,
-                writer.graphLens,
-                writer.initClassLens,
                 writer.namingLens,
                 writer.appView,
                 executorService)
@@ -589,8 +564,6 @@
                 classes,
                 originalNames,
                 fileIndexOffset,
-                writer.graphLens,
-                writer.initClassLens,
                 writer.namingLens,
                 options)
             .call();
@@ -642,10 +615,9 @@
     private final Set<DexCallSite> callSites = Sets.newIdentityHashSet();
     private final Set<DexMethodHandle> methodHandles = Sets.newIdentityHashSet();
 
-    public VirtualFileIndexedItemCollection(
-        GraphLens graphLens, InitClassLens initClassLens, NamingLens namingLens) {
-      this.graphLens = graphLens;
-      this.initClassLens = initClassLens;
+    public VirtualFileIndexedItemCollection(AppView<?> appView, NamingLens namingLens) {
+      this.graphLens = appView.graphLens();
+      this.initClassLens = appView.initClassLens();
       this.namingLens = namingLens;
     }
 
@@ -732,8 +704,8 @@
 
   public static class IndexedItemTransaction implements IndexedItemCollection {
 
+    private final AppView<?> appView;
     private final VirtualFileIndexedItemCollection base;
-    private final GraphLens graphLens;
     private final InitClassLens initClassLens;
     private final NamingLens namingLens;
     private final LensCodeRewriterUtils rewriter;
@@ -750,12 +722,10 @@
     private IndexedItemTransaction(
         VirtualFileIndexedItemCollection base,
         AppView<?> appView,
-        GraphLens graphLens,
-        InitClassLens initClassLens,
         NamingLens namingLens) {
+      this.appView = appView;
       this.base = base;
-      this.graphLens = graphLens;
-      this.initClassLens = initClassLens;
+      this.initClassLens = appView.initClassLens();
       this.namingLens = namingLens;
       this.rewriter = new LensCodeRewriterUtils(appView, true);
     }
@@ -769,7 +739,7 @@
     }
 
     void addClassAndDependencies(DexProgramClass clazz) {
-      clazz.collectIndexedItems(this, graphLens, rewriter);
+      clazz.collectIndexedItems(this, getGraphLens(), rewriter);
     }
 
     @Override
@@ -815,7 +785,7 @@
 
     @Override
     public GraphLens getGraphLens() {
-      return graphLens;
+      return appView.graphLens();
     }
 
     @Override
@@ -901,8 +871,6 @@
 
     private final List<VirtualFile> files;
     private final AppView<?> appView;
-    private final GraphLens graphLens;
-    private final InitClassLens initClassLens;
     private final NamingLens namingLens;
 
     private int nextFileId;
@@ -913,14 +881,10 @@
     VirtualFileCycler(
         List<VirtualFile> files,
         AppView<?> appView,
-        GraphLens graphLens,
-        InitClassLens initClassLens,
         NamingLens namingLens,
         int fileIndexOffset) {
       this.files = files;
       this.appView = appView;
-      this.graphLens = graphLens;
-      this.initClassLens = initClassLens;
       this.namingLens = namingLens;
 
       nextFileId = files.size() + fileIndexOffset;
@@ -951,9 +915,7 @@
       if (hasNext()) {
         return activeFiles.next();
       } else {
-        VirtualFile newFile =
-            new VirtualFile(
-                nextFileId++, appView, graphLens, initClassLens, namingLens, featuresplit);
+        VirtualFile newFile = new VirtualFile(nextFileId++, appView, namingLens, featuresplit);
         files.add(newFile);
         allFilesCyclic = Iterators.cycle(files);
         return newFile;
@@ -984,9 +946,7 @@
     }
 
     VirtualFile addFile() {
-      VirtualFile newFile =
-          new VirtualFile(
-              nextFileId++, appView, graphLens, initClassLens, namingLens, featuresplit);
+      VirtualFile newFile = new VirtualFile(nextFileId++, appView, namingLens, featuresplit);
       files.add(newFile);
 
       reset();
@@ -1030,17 +990,13 @@
         Set<DexProgramClass> classes,
         Map<DexProgramClass, String> originalNames,
         int fileIndexOffset,
-        GraphLens graphLens,
-        InitClassLens initClassLens,
         NamingLens namingLens,
         InternalOptions options) {
       this.classes = new ArrayList<>(classes);
       this.originalNames = originalNames;
       this.dexItemFactory = appView.dexItemFactory();
       this.options = options;
-      this.cycler =
-          new VirtualFileCycler(
-              files, appView, graphLens, initClassLens, namingLens, fileIndexOffset);
+      this.cycler = new VirtualFileCycler(files, appView, namingLens, fileIndexOffset);
     }
 
     static boolean coveredByPrefix(String originalName, String currentPrefix) {
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
index fcdafdd..3d987c1 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -54,9 +54,7 @@
 
   public ObjectToOffsetMapping(
       AppView<?> appView,
-      GraphLens graphLens,
       NamingLens namingLens,
-      InitClassLens initClassLens,
       LensCodeRewriterUtils lensCodeRewriter,
       Collection<DexProgramClass> classes,
       Collection<DexProto> protos,
@@ -69,7 +67,6 @@
       int lazyDexStringsCount,
       Timing timing) {
     assert appView != null;
-    assert graphLens != null;
     assert classes != null;
     assert protos != null;
     assert types != null;
@@ -78,12 +75,11 @@
     assert strings != null;
     assert callSites != null;
     assert methodHandles != null;
-    assert initClassLens != null;
     this.lazyDexStringsCount = lazyDexStringsCount;
     this.appView = appView;
-    this.graphLens = graphLens;
+    this.graphLens = appView.graphLens();
     this.namingLens = namingLens;
-    this.initClassLens = initClassLens;
+    this.initClassLens = appView.initClassLens();
     this.lensCodeRewriter = lensCodeRewriter;
     timing.begin("Sort strings");
     this.strings =
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 3d91587..27298a9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -23,6 +23,7 @@
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.DexValue.DexValueNull;
 import com.android.tools.r8.graph.FieldAccessFlags;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.MethodResolutionResult;
@@ -33,11 +34,14 @@
 import com.android.tools.r8.ir.desugar.lambda.ForcefullyMovedLambdaMethodConsumer;
 import com.android.tools.r8.ir.desugar.lambda.LambdaInstructionDesugaring;
 import com.android.tools.r8.ir.desugar.lambda.LambdaInstructionDesugaring.DesugarInvoke;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
 import com.android.tools.r8.synthesis.SyntheticProgramClassBuilder;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.function.Consumer;
+import org.objectweb.asm.Opcodes;
 
 /**
  * Represents lambda class generated for a lambda descriptor in context of lambda instantiation
@@ -60,11 +64,15 @@
   public static final String JAVAC_EXPECTED_LAMBDA_METHOD_PREFIX = "lambda$";
   public static final String R8_LAMBDA_ACCESSOR_METHOD_PREFIX = "$r8$lambda$";
 
+  private static final OptimizationFeedback feedback = OptimizationFeedbackSimple.getInstance();
+
   final AppView<?> appView;
   final LambdaInstructionDesugaring desugaring;
   public final DexType type;
   public LambdaDescriptor descriptor;
   public final DexMethod constructor;
+  final DexMethod classConstructor;
+  public final DexField lambdaField;
   public final Target target;
 
   // Considered final but is set after due to circularity in allocation.
@@ -91,6 +99,16 @@
 
     this.target = createTarget(accessedFrom);
 
+    boolean statelessSingleton = isStatelessSingleton();
+    this.classConstructor =
+        statelessSingleton
+            ? factory.createMethod(type, constructorProto, factory.classConstructorMethodName)
+            : null;
+    this.lambdaField =
+        statelessSingleton
+            ? factory.createField(type, type, factory.lambdaInstanceFieldName)
+            : null;
+
     // Synthesize the program class once all fields are set.
     synthesizeLambdaClass(builder, desugarInvoke);
   }
@@ -114,12 +132,13 @@
   private void synthesizeLambdaClass(
       SyntheticProgramClassBuilder builder, DesugarInvoke desugarInvoke) {
     builder.setInterfaces(descriptor.interfaces);
+    synthesizeStaticFields(builder);
     synthesizeInstanceFields(builder);
     synthesizeDirectMethods(builder);
     synthesizeVirtualMethods(builder, desugarInvoke);
   }
 
-  DexField getCaptureField(int index) {
+  final DexField getCaptureField(int index) {
     return appView
         .dexItemFactory()
         .createField(
@@ -128,6 +147,10 @@
             appView.dexItemFactory().createString("f$" + index));
   }
 
+  public final boolean isStatelessSingleton() {
+    return appView.options().createSingletonsForStatelessLambdas && descriptor.isStateless();
+  }
+
   // Synthesize virtual methods.
   private void synthesizeVirtualMethods(
       SyntheticProgramClassBuilder builder, DesugarInvoke desugarInvoke) {
@@ -172,19 +195,39 @@
 
   // Synthesize direct methods.
   private void synthesizeDirectMethods(SyntheticProgramClassBuilder builder) {
+    boolean statelessSingleton = isStatelessSingleton();
+    List<DexEncodedMethod> methods = new ArrayList<>(statelessSingleton ? 2 : 1);
+
     // Constructor.
     MethodAccessFlags accessFlags =
         MethodAccessFlags.fromSharedAccessFlags(
-            Constants.ACC_PUBLIC | Constants.ACC_SYNTHETIC, true);
-    DexEncodedMethod method =
+            (statelessSingleton ? Constants.ACC_PRIVATE : Constants.ACC_PUBLIC)
+                | Constants.ACC_SYNTHETIC,
+            true);
+    methods.add(
         DexEncodedMethod.syntheticBuilder()
             .setMethod(constructor)
             .setAccessFlags(accessFlags)
             .setCode(LambdaConstructorSourceCode.build(this))
             // The api level is computed when tracing.
             .disableAndroidApiLevelCheck()
-            .build();
-    builder.setDirectMethods(Collections.singletonList(method));
+            .build());
+
+    // Class constructor for stateless lambda classes.
+    if (statelessSingleton) {
+      methods.add(
+          DexEncodedMethod.syntheticBuilder()
+              .setMethod(classConstructor)
+              .setAccessFlags(
+                  MethodAccessFlags.fromSharedAccessFlags(
+                      Constants.ACC_SYNTHETIC | Constants.ACC_STATIC, true))
+              .setCode(LambdaClassConstructorSourceCode.build(this))
+              // The api level is computed when tracing.
+              .disableAndroidApiLevelCheck()
+              .build());
+      feedback.classInitializerMayBePostponed(methods.get(1));
+    }
+    builder.setDirectMethods(methods);
   }
 
   // Synthesize instance fields to represent captured values.
@@ -207,6 +250,43 @@
     builder.setInstanceFields(fields);
   }
 
+  // Synthesize static fields to represent singleton instance.
+  private void synthesizeStaticFields(SyntheticProgramClassBuilder builder) {
+    if (isStatelessSingleton()) {
+      // Create instance field for stateless lambda.
+      assert this.lambdaField != null;
+      builder.setStaticFields(
+          Collections.singletonList(
+              DexEncodedField.syntheticBuilder()
+                  .setField(this.lambdaField)
+                  .setAccessFlags(
+                      FieldAccessFlags.fromSharedAccessFlags(
+                          Constants.ACC_PUBLIC
+                              | Constants.ACC_FINAL
+                              | Constants.ACC_SYNTHETIC
+                              | Constants.ACC_STATIC))
+                  .setStaticValue(DexValueNull.NULL)
+                  // The api level is computed when tracing.
+                  .disableAndroidApiLevelCheck()
+                  .build()));
+    }
+  }
+
+  public static int getAsmOpcodeForInvokeType(MethodHandleType type) {
+    switch (type) {
+      case INVOKE_INTERFACE:
+        return Opcodes.INVOKEINTERFACE;
+      case INVOKE_STATIC:
+        return Opcodes.INVOKESTATIC;
+      case INVOKE_DIRECT:
+        return Opcodes.INVOKESPECIAL;
+      case INVOKE_INSTANCE:
+        return Opcodes.INVOKEVIRTUAL;
+      default:
+        throw new Unreachable("Unexpected method handle type: " + type);
+    }
+  }
+
   // Creates a delegation target for this particular lambda class. Note that we
   // should always be able to create targets for the lambdas we support.
   private Target createTarget(ProgramMethod accessedFrom) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
new file mode 100644
index 0000000..ddcb68d
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
@@ -0,0 +1,35 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.desugar;
+
+import com.android.tools.r8.cf.code.CfInvoke;
+import com.android.tools.r8.cf.code.CfNew;
+import com.android.tools.r8.cf.code.CfReturnVoid;
+import com.android.tools.r8.cf.code.CfStackInstruction;
+import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
+import com.android.tools.r8.cf.code.CfStaticFieldWrite;
+import com.android.tools.r8.graph.CfCode;
+import com.google.common.collect.ImmutableList;
+import org.objectweb.asm.Opcodes;
+
+// Source code representing synthesized lambda class constructor.
+// Used for stateless lambdas to instantiate singleton instance.
+final class LambdaClassConstructorSourceCode {
+
+  public static CfCode build(LambdaClass lambda) {
+    int maxStack = 2;
+    int maxLocals = 0;
+    return new CfCode(
+        lambda.type,
+        maxStack,
+        maxLocals,
+        ImmutableList.of(
+            new CfNew(lambda.type),
+            new CfStackInstruction(Opcode.Dup),
+            new CfInvoke(Opcodes.INVOKESPECIAL, lambda.constructor, false),
+            new CfStaticFieldWrite(lambda.lambdaField, lambda.lambdaField),
+            new CfReturnVoid()));
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
index e72af99..bc7a544 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
@@ -190,6 +190,15 @@
     }
   }
 
+  public Iterable<DexType> getReferencedBaseTypes(DexItemFactory dexItemFactory) {
+    return enforcedProto.getBaseTypes(dexItemFactory);
+  }
+
+  /** Is a stateless lambda, i.e. lambda does not capture any values */
+  final boolean isStateless() {
+    return captures.isEmpty();
+  }
+
   /** Checks if call site needs a accessor when referenced from `accessedFrom`. */
   boolean needsAccessor(ProgramMethod accessedFrom) {
     if (implHandle.type.isInvokeInterface()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
index e305984..f7e8d1a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.cf.code.CfNew;
 import com.android.tools.r8.cf.code.CfStackInstruction;
 import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
+import com.android.tools.r8.cf.code.CfStaticFieldRead;
 import com.android.tools.r8.cf.code.CfStore;
 import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
 import com.android.tools.r8.graph.AppView;
@@ -31,6 +32,7 @@
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
 import com.android.tools.r8.synthesis.SyntheticNaming;
 import com.android.tools.r8.utils.Box;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import java.util.ArrayDeque;
 import java.util.Collection;
@@ -119,6 +121,11 @@
 
     eventConsumer.acceptLambdaClass(lambdaClass, context);
 
+    if (lambdaClass.isStatelessSingleton()) {
+      return ImmutableList.of(
+          new CfStaticFieldRead(lambdaClass.lambdaField, lambdaClass.lambdaField));
+    }
+
     DexTypeList captureTypes = lambdaClass.descriptor.captures;
     Deque<CfInstruction> replacement = new ArrayDeque<>(3 + captureTypes.size() * 2);
     replacement.add(new CfNew(lambdaClass.getType()));
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index 98057dd..1332bf7 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -35,7 +35,6 @@
 import com.android.tools.r8.graph.DexValue.DexValueArray;
 import com.android.tools.r8.graph.DexValue.DexValueInt;
 import com.android.tools.r8.graph.DexValue.DexValueString;
-import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.graph.NestMemberClassAttribute;
 import com.android.tools.r8.graph.ParameterAnnotationsList;
@@ -87,7 +86,6 @@
 
   private final DexApplication application;
   private final AppView<?> appView;
-  private final GraphLens graphLens;
   private final NamingLens namingLens;
   private final InternalOptions options;
   private final Marker marker;
@@ -95,11 +93,9 @@
 
   private static final CfVersion MIN_VERSION_FOR_COMPILER_GENERATED_CODE = CfVersion.V1_6;
 
-  public CfApplicationWriter(
-      AppView<?> appView, Marker marker, GraphLens graphLens, NamingLens namingLens) {
+  public CfApplicationWriter(AppView<?> appView, Marker marker, NamingLens namingLens) {
     this.application = appView.appInfo().app();
     this.appView = appView;
-    this.graphLens = graphLens;
     this.namingLens = namingLens;
     this.options = appView.options();
     assert marker != null;
@@ -180,8 +176,7 @@
                     e.getCodeSize()));
       }
     }
-    ApplicationWriter.supplyAdditionalConsumers(
-        application, appView, graphLens, namingLens, options);
+    ApplicationWriter.supplyAdditionalConsumers(application, appView, namingLens, options);
   }
 
   private void writeClass(
diff --git a/src/main/java/com/android/tools/r8/relocator/Relocator.java b/src/main/java/com/android/tools/r8/relocator/Relocator.java
index d0836d7..cd3adfe 100644
--- a/src/main/java/com/android/tools/r8/relocator/Relocator.java
+++ b/src/main/java/com/android/tools/r8/relocator/Relocator.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.graph.AppServices;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
-import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.jar.CfApplicationWriter;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
@@ -88,8 +87,7 @@
 
       new GenericSignatureRewriter(appView, namingLens).run(appInfo.classes(), executor);
 
-      new CfApplicationWriter(
-              appView, new Marker(Tool.Relocator), GraphLens.getIdentityLens(), namingLens)
+      new CfApplicationWriter(appView, new Marker(Tool.Relocator), namingLens)
           .write(command.getConsumer());
       options.printWarnings();
     } catch (ExecutionException e) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 12e0a78..e359381 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -360,6 +360,11 @@
   // Boolean value indicating that byte code pass through may be enabled.
   public boolean enableCfByteCodePassThrough = false;
 
+  // Flag to control the representation of stateless lambdas.
+  // See b/222081665 for context.
+  public boolean createSingletonsForStatelessLambdas =
+      System.getProperty("com.android.tools.r8.createSingletonsForStatelessLambdas") != null;
+
   // Contain the contents of the build properties file from the compiler command.
   public DumpOptions dumpOptions;
 
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 548279c..e0bb322 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -23,8 +23,6 @@
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.Position;
@@ -2256,13 +2254,11 @@
     R8.writeApplication(
         Executors.newSingleThreadExecutor(),
         appView,
-        GraphLens.getIdentityLens(),
-        InitClassLens.getThrowingInstance(),
         NamingLens.getIdentityLens(),
         options,
         null);
   }
-  
+
   public static void disassemble(AndroidApp app, PrintStream ps) throws IOException {
     DexApplication application =
         new ApplicationReader(app, new InternalOptions(), Timing.empty()).read().toDirect();
diff --git a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
index 9c4c113..63dd7ed 100644
--- a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
+++ b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import com.android.tools.r8.naming.NamingLens;
@@ -51,9 +50,7 @@
                     .build()));
     return new ObjectToOffsetMapping(
         appView,
-        GraphLens.getIdentityLens(),
         NamingLens.getIdentityLens(),
-        InitClassLens.getThrowingInstance(),
         new LensCodeRewriterUtils(appView),
         Collections.emptyList(),
         Collections.emptyList(),
@@ -70,7 +67,7 @@
   @Test
   public void testEmptyDebugInfo() {
     DexDebugInfo debugInfo =
-        new EventBasedDebugInfo(1, DexString.EMPTY_ARRAY, new DexDebugEvent[] {});
+        new EventBasedDebugInfo(1, DexString.EMPTY_ARRAY, DexDebugEvent.EMPTY_ARRAY);
     DebugBytecodeWriter writer =
         new DebugBytecodeWriter(
             DexDebugInfo.convertToWritable(debugInfo),
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index 6031ece..249e78d 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -48,8 +48,6 @@
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -883,8 +881,6 @@
         new ApplicationWriter(
             AppView.createForD8(AppInfo.createInitialAppInfo(application)),
             null,
-            GraphLens.getIdentityLens(),
-            InitClassLens.getThrowingInstance(),
             NamingLens.getIdentityLens());
     ExecutorService executor = ThreadUtils.getExecutorService(options);
     AndroidAppConsumers compatSink = new AndroidAppConsumers(options);
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java
index bdeecf4..ae1fdbf 100644
--- a/src/test/java/com/android/tools/r8/utils/Smali.java
+++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -11,8 +11,6 @@
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
-import com.android.tools.r8.graph.GraphLens;
-import com.android.tools.r8.graph.InitClassLens;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
 import com.google.common.collect.ImmutableList;
@@ -117,8 +115,6 @@
           new ApplicationWriter(
               AppView.createForD8(AppInfo.createInitialAppInfo(dexApp)),
               null,
-              GraphLens.getIdentityLens(),
-              InitClassLens.getThrowingInstance(),
               NamingLens.getIdentityLens());
       writer.write(executor);
       return consumer.contents;
