diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
index f33a1d4..caca28e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
@@ -134,10 +134,10 @@
 
   @Override
   public ArrayTypeElement fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
     if (memberTypeLattice.isReferenceType()) {
       TypeElement substitutedMemberType =
-          memberTypeLattice.fixupClassTypeReferences(mapping, appView);
+          memberTypeLattice.fixupClassTypeReferences(appView, mapping);
       if (substitutedMemberType != memberTypeLattice) {
         return ArrayTypeElement.create(substitutedMemberType, nullability);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
index 144f465..e1a924c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
@@ -156,7 +156,7 @@
 
   @Override
   public TypeElement fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
     DexType mappedType = mapping.apply(type);
     if (mappedType.isPrimitiveType()) {
       return PrimitiveTypeElement.fromDexType(mappedType, false);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
index a89c486..88d8b66 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
@@ -85,7 +85,7 @@
               || operandType.isPrimitiveType()
               || operandType.isNullType()
               || (operandType.isReferenceType()
-                  && operandType.fixupClassTypeReferences(mapping, appView) == operandType);
+                  && operandType.fixupClassTypeReferences(appView, mapping) == operandType);
         }
       }
     }
@@ -98,7 +98,7 @@
       BasicBlock block = blocks.next();
       for (Phi phi : block.getPhis()) {
         TypeElement phiType = phi.getType();
-        TypeElement substituted = phiType.fixupClassTypeReferences(mapping, appView);
+        TypeElement substituted = phiType.fixupClassTypeReferences(appView, mapping);
         assert substituted == phiType || affectedPhis.contains(phi);
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
index 9736b13..ecc466a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.ir.code.Value;
 import java.util.function.Function;
 
@@ -68,10 +69,15 @@
   }
 
   public TypeElement fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
     return this;
   }
 
+  public final TypeElement rewrittenWithLens(
+      AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens graphLens) {
+    return fixupClassTypeReferences(appView, graphLens::lookupType);
+  }
+
   public boolean isNullable() {
     return nullability().isNullable();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 66e7ff7..b02d5e7 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -122,8 +122,7 @@
   private Value makeOutValue(Instruction insn, IRCode code) {
     if (insn.outValue() != null) {
       TypeElement oldType = insn.getOutType();
-      TypeElement newType =
-          oldType.fixupClassTypeReferences(appView.graphLens()::lookupType, appView);
+      TypeElement newType = oldType.rewrittenWithLens(appView, appView.graphLens());
       return code.createValue(newType, insn.getLocalInfo());
     }
     return null;
@@ -622,8 +621,7 @@
               Assume assume = current.asAssume();
               if (assume.hasOutValue()) {
                 TypeElement type = assume.getOutType();
-                TypeElement substituted =
-                    type.fixupClassTypeReferences(graphLens::lookupType, appView);
+                TypeElement substituted = type.rewrittenWithLens(appView, graphLens);
                 if (substituted != type) {
                   assert type.isArrayType() || type.isClassType();
                   if (substituted.isPrimitiveType()) {
@@ -659,8 +657,7 @@
             if (current.hasOutValue()) {
               // For all other instructions, substitute any changed type.
               TypeElement type = current.getOutType();
-              TypeElement substituted =
-                  type.fixupClassTypeReferences(graphLens::lookupType, appView);
+              TypeElement substituted = type.rewrittenWithLens(appView, graphLens);
               if (substituted != type) {
                 current.outValue().setType(substituted);
                 affectedPhis.addAll(current.outValue().uniquePhiUsers());
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index 5afd25d..b637199 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -77,8 +77,7 @@
 import com.android.tools.r8.ir.optimize.enums.EnumInstanceFieldData.EnumInstanceFieldOrdinalData;
 import com.android.tools.r8.ir.optimize.enums.EnumInstanceFieldData.EnumInstanceFieldUnknownData;
 import com.android.tools.r8.ir.optimize.enums.eligibility.Reason;
-import com.android.tools.r8.ir.optimize.info.FieldOptimizationInfo;
-import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.MutableFieldOptimizationInfo;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedback.OptimizationInfoFixer;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
 import com.android.tools.r8.ir.optimize.info.UpdatableMethodOptimizationInfo;
@@ -469,31 +468,20 @@
         executorService,
         new OptimizationInfoFixer() {
           @Override
-          public void fixup(DexEncodedField field) {
-            FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
-            if (optimizationInfo.isMutableFieldOptimizationInfo()) {
-              optimizationInfo
-                  .asMutableFieldOptimizationInfo()
-                  .fixupClassTypeReferences(appView.graphLens()::lookupType, appView)
-                  .fixupAbstractValue(appView, appView.graphLens());
-            } else {
-              assert optimizationInfo.isDefaultFieldOptimizationInfo();
-            }
+          public void fixup(DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo) {
+            optimizationInfo
+                .asMutableFieldOptimizationInfo()
+                .fixupClassTypeReferences(appView, appView.graphLens())
+                .fixupAbstractValue(appView, appView.graphLens());
           }
 
           @Override
-          public void fixup(DexEncodedMethod method) {
-            MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
-            if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
-              UpdatableMethodOptimizationInfo updatableOptimizationInfo =
-                  optimizationInfo.asUpdatableMethodOptimizationInfo();
-              updatableOptimizationInfo
-                  .fixupClassTypeReferences(appView.graphLens()::lookupType, appView)
-                  .fixupAbstractReturnValue(appView, appView.graphLens())
-                  .fixupInstanceInitializerInfo(appView, appView.graphLens());
-            } else {
-              assert optimizationInfo.isDefaultMethodOptimizationInfo();
-            }
+          public void fixup(
+              DexEncodedMethod method, UpdatableMethodOptimizationInfo optimizationInfo) {
+            optimizationInfo
+                .fixupClassTypeReferences(appView, appView.graphLens())
+                .fixupAbstractReturnValue(appView, appView.graphLens())
+                .fixupInstanceInitializerInfo(appView, appView.graphLens());
           }
         });
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
index 41ee658..b2f291a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
@@ -6,14 +6,12 @@
 
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.analysis.value.AbstractValue;
 import com.android.tools.r8.ir.analysis.value.UnknownValue;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import java.util.function.Function;
 
 /**
  * Optimization info for fields.
@@ -35,13 +33,13 @@
   private TypeElement dynamicUpperBoundType = null;
 
   public MutableFieldOptimizationInfo fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens lens) {
     if (dynamicUpperBoundType != null) {
-      dynamicUpperBoundType = dynamicUpperBoundType.fixupClassTypeReferences(mapping, appView);
+      dynamicUpperBoundType = dynamicUpperBoundType.rewrittenWithLens(appView, lens);
     }
     if (dynamicLowerBoundType != null) {
       TypeElement dynamicLowerBoundType =
-          this.dynamicLowerBoundType.fixupClassTypeReferences(mapping, appView);
+          this.dynamicLowerBoundType.rewrittenWithLens(appView, lens);
       if (dynamicLowerBoundType.isClassType()) {
         this.dynamicLowerBoundType = dynamicLowerBoundType.asClassType();
       } else {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
index 46cff7b..256f80a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
@@ -20,9 +20,9 @@
 
   public interface OptimizationInfoFixer {
 
-    void fixup(DexEncodedField field);
+    void fixup(DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo);
 
-    void fixup(DexEncodedMethod method);
+    void fixup(DexEncodedMethod method, UpdatableMethodOptimizationInfo optimizationInfo);
   }
 
   public void fixupOptimizationInfos(
@@ -31,8 +31,22 @@
     ThreadUtils.processItems(
         appView.appInfo().classes(),
         clazz -> {
-          clazz.fields().forEach(fixer::fixup);
-          clazz.methods().forEach(fixer::fixup);
+          for (DexEncodedField field : clazz.fields()) {
+            FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
+            if (optimizationInfo.isMutableFieldOptimizationInfo()) {
+              fixer.fixup(field, optimizationInfo.asMutableFieldOptimizationInfo());
+            } else {
+              assert optimizationInfo.isDefaultFieldOptimizationInfo();
+            }
+          }
+          for (DexEncodedMethod method : clazz.methods()) {
+            MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
+            if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
+              fixer.fixup(method, optimizationInfo.asUpdatableMethodOptimizationInfo());
+            } else {
+              assert optimizationInfo.isDefaultMethodOptimizationInfo();
+            }
+          }
         },
         executorService);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
index d6bdd6b..e33f49c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
@@ -23,7 +23,6 @@
 import com.android.tools.r8.utils.BooleanUtils;
 import java.util.BitSet;
 import java.util.Set;
-import java.util.function.Function;
 
 public class UpdatableMethodOptimizationInfo extends MethodOptimizationInfo {
 
@@ -147,14 +146,14 @@
   }
 
   public UpdatableMethodOptimizationInfo fixupClassTypeReferences(
-      Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+      AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens lens) {
     if (returnsObjectWithUpperBoundType != null) {
       returnsObjectWithUpperBoundType =
-          returnsObjectWithUpperBoundType.fixupClassTypeReferences(mapping, appView);
+          returnsObjectWithUpperBoundType.rewrittenWithLens(appView, lens);
     }
     if (returnsObjectWithLowerBoundType != null) {
       TypeElement returnsObjectWithLowerBoundType =
-          this.returnsObjectWithLowerBoundType.fixupClassTypeReferences(mapping, appView);
+          this.returnsObjectWithLowerBoundType.rewrittenWithLens(appView, lens);
       if (returnsObjectWithLowerBoundType.isClassType()) {
         this.returnsObjectWithLowerBoundType = returnsObjectWithLowerBoundType.asClassType();
       } else {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
index 262671f..708c84a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
@@ -62,12 +62,9 @@
     }
     return new InstanceFieldTypeInitializationInfo(
         dynamicLowerBoundType != null
-            ? dynamicLowerBoundType
-                .fixupClassTypeReferences(lens::lookupType, appView.withClassHierarchy())
-                .asClassType()
+            ? dynamicLowerBoundType.rewrittenWithLens(appView, lens).asClassType()
             : null,
-        dynamicUpperBoundType.fixupClassTypeReferences(
-            lens::lookupType, appView.withClassHierarchy()));
+        dynamicUpperBoundType.rewrittenWithLens(appView, lens));
   }
 
   @Override
