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 7fbfd5a..c92307e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -201,6 +201,10 @@
     return accessFlags;
   }
 
+  public CompilationState getCompilationState() {
+    return compilationState;
+  }
+
   public DexEncodedMethod getDefaultInterfaceMethodImplementation() {
     return defaultInterfaceMethodImplementation;
   }
@@ -1511,12 +1515,26 @@
       this.method = method;
     }
 
+    public Builder setCompilationState(CompilationState compilationState) {
+      assert this.compilationState == CompilationState.NOT_PROCESSED;
+      this.compilationState = compilationState;
+      return this;
+    }
+
     public Builder setIsLibraryMethodOverride(OptionalBool isLibraryMethodOverride) {
       assert !isLibraryMethodOverride.isUnknown();
       this.isLibraryMethodOverride = isLibraryMethodOverride;
       return this;
     }
 
+    public Builder setIsLibraryMethodOverrideIf(
+        boolean condition, OptionalBool isLibraryMethodOverride) {
+      if (condition) {
+        return setIsLibraryMethodOverride(isLibraryMethodOverride);
+      }
+      return this;
+    }
+
     public Builder setParameterAnnotations(ParameterAnnotationsList parameterAnnotations) {
       this.parameterAnnotations = parameterAnnotations;
       return this;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index 4df9c8d..280dc9b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -116,28 +116,30 @@
     return encodedMethod.toTypeSubstitutedMethod(newMethod);
   }
 
-  private DexEncodedMethod fixupEncodedMethod(DexEncodedMethod encodedMethod) {
-    DexProto newProto = fixupProto(encodedMethod.proto());
-    if (newProto == encodedMethod.proto()) {
-      return encodedMethod;
+  private DexEncodedMethod fixupEncodedMethod(DexEncodedMethod method) {
+    DexProto newProto = fixupProto(method.proto());
+    if (newProto == method.proto()) {
+      return method;
     }
-    assert !encodedMethod.isClassInitializer();
+    assert !method.isClassInitializer();
     // We add the $enumunboxing$ suffix to make sure we do not create a library override.
     String newMethodName =
-        encodedMethod.getName().toString()
-            + (encodedMethod.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
-    DexMethod newMethod = factory.createMethod(encodedMethod.holder(), newProto, newMethodName);
-    newMethod = ensureUniqueMethod(encodedMethod, newMethod);
-    int numberOfExtraNullParameters = newMethod.getArity() - encodedMethod.method.getArity();
-    boolean isStatic = encodedMethod.isStatic();
-    lensBuilder.move(
-        encodedMethod.method, newMethod, isStatic, isStatic, numberOfExtraNullParameters);
-    DexEncodedMethod newEncodedMethod = encodedMethod.toTypeSubstitutedMethod(newMethod);
-    assert !encodedMethod.isLibraryMethodOverride().isTrue()
+        method.getName().toString() + (method.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
+    DexMethod newMethod = factory.createMethod(method.getHolderType(), newProto, newMethodName);
+    newMethod = ensureUniqueMethod(method, newMethod);
+    int numberOfExtraNullParameters = newMethod.getArity() - method.method.getArity();
+    boolean isStatic = method.isStatic();
+    lensBuilder.move(method.method, newMethod, isStatic, isStatic, numberOfExtraNullParameters);
+    DexEncodedMethod newEncodedMethod =
+        method.toTypeSubstitutedMethod(
+            newMethod,
+            builder ->
+                builder
+                    .setCompilationState(method.getCompilationState())
+                    .setIsLibraryMethodOverrideIf(
+                        method.isNonPrivateVirtualMethod(), OptionalBool.FALSE));
+    assert !method.isLibraryMethodOverride().isTrue()
         : "Enum unboxing is changing the signature of a library override in a non unboxed class.";
-    if (newEncodedMethod.isNonPrivateVirtualMethod()) {
-      newEncodedMethod.setLibraryMethodOverride(OptionalBool.FALSE);
-    }
     return newEncodedMethod;
   }
 
