diff --git a/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java b/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
index e793190..8f8444c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
@@ -51,32 +51,33 @@
     return !fitsInDexInstruction(value);
   }
 
-  public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+  @Override
+  public ConstInstruction fold(IRCode code) {
     assert canBeFolded();
     if (type == NumericType.INT) {
       int left = leftValue().getConstInstruction().asConstNumber().getIntValue();
       int right = rightValue().getConstInstruction().asConstNumber().getIntValue();
       int result = foldIntegers(left, right);
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+      Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
       return new ConstNumber(ConstType.INT, value, result);
     } else if (type == NumericType.LONG) {
       long left = leftValue().getConstInstruction().asConstNumber().getLongValue();
       long right = rightValue().getConstInstruction().asConstNumber().getLongValue();
       long result = foldLongs(left, right);
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+      Value value = code.createValue(MoveType.WIDE, getDebugInfo());
       return new ConstNumber(ConstType.LONG, value, result);
     } else if (type == NumericType.FLOAT) {
       float left = leftValue().getConstInstruction().asConstNumber().getFloatValue();
       float right = rightValue().getConstInstruction().asConstNumber().getFloatValue();
       float result = foldFloat(left, right);
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+      Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
       return new ConstNumber(ConstType.FLOAT, value, Float.floatToIntBits(result));
     } else {
       assert type == NumericType.DOUBLE;
       double left = leftValue().getConstInstruction().asConstNumber().getDoubleValue();
       double right = rightValue().getConstInstruction().asConstNumber().getDoubleValue();
       double result = foldDouble(left, right);
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+      Value value = code.createValue(MoveType.WIDE, getDebugInfo());
       return new ConstNumber(ConstType.DOUBLE, value, Double.doubleToLongBits(result));
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index 35cf808..232e0ff 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -19,6 +19,7 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.function.Consumer;
@@ -632,8 +633,12 @@
     assert unfilledPredecessorsCount > 0;
     if (--unfilledPredecessorsCount == 0) {
       assert estimatedPredecessorsCount == predecessors.size();
-      for (Phi phi : incompletePhis.values()) {
-        phi.addOperands(builder);
+      for (Entry<Integer, Phi> entry : incompletePhis.entrySet()) {
+        int register = entry.getKey();
+        if (register < 0) {
+          register = onThrowValueRegister(register);
+        }
+        entry.getValue().addOperands(builder, register);
       }
       sealed = true;
       incompletePhis.clear();
@@ -1087,7 +1092,7 @@
       newPredecessors.add(newBlock);
       if (hasMoveException) {
         Value value = new Value(
-            valueNumberGenerator.next(), -1, MoveType.OBJECT, move.getDebugInfo());
+            valueNumberGenerator.next(), MoveType.OBJECT, move.getDebugInfo());
         values.add(value);
         newBlock.add(new MoveException(value));
       }
@@ -1105,7 +1110,7 @@
     // Insert a phi for the move-exception value.
     if (hasMoveException) {
       Phi phi = new Phi(valueNumberGenerator.next(),
-          -1, this, MoveType.OBJECT, move.getLocalInfo());
+          this, MoveType.OBJECT, move.getLocalInfo());
       phi.addOperands(values);
       move.outValue().replaceUsers(phi);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
index b35812b..8e019cc 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
@@ -327,7 +327,7 @@
       if ((i == 0) && (downcast != null)) {
         Value invokeValue = invoke.inValues().get(0);
         Value receiverValue = arguments.get(0);
-        Value value = new Value(code.valueNumberGenerator.next(), -1, MoveType.OBJECT, null);
+        Value value = code.createValue(MoveType.OBJECT);
         castInstruction = new CheckCast(value, invokeValue, downcast);
         receiverValue.replaceUsers(value);
       } else {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Cmp.java b/src/main/java/com/android/tools/r8/ir/code/Cmp.java
index c5cc82f..3d20415 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Cmp.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Cmp.java
@@ -147,7 +147,7 @@
   }
 
   @Override
-  public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+  public ConstInstruction fold(IRCode code) {
     assert canBeFolded();
     int result;
     if (type == NumericType.LONG) {
@@ -180,7 +180,7 @@
       }
     }
     assert result == -1 || result == 0 || result == 1;
-    Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+    Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
     return new ConstNumber(ConstType.INT, value, result);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
index 8aff14a..451832f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
@@ -38,7 +38,6 @@
     Value newValue =
         new Value(
             code.valueNumberGenerator.next(),
-            original.outValue().getOriginalRegister(),
             original.outType(),
             original.getDebugInfo());
     return new ConstNumber(original.type, newValue, original.getRawValue());
diff --git a/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java b/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
index c63d323..c5a7bbb 100644
--- a/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
+++ b/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
@@ -10,7 +10,7 @@
 
   public FixedRegisterValue(MoveType type, int register) {
     // Set local info to null since these values are never representatives of live-ranges.
-    super(-1, -1, type, null);
+    super(-1, type, null);
     setNeedsRegister(true);
     this.register = register;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 94eeb55..3ff0624 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -347,4 +347,12 @@
         == method.method.proto.parameters.values.length + (method.accessFlags.isStatic() ? 0 : 1);
     return arguments;
   }
+
+  public Value createValue(MoveType moveType, Value.DebugInfo debugInfo) {
+    return new Value(valueNumberGenerator.next(), moveType, debugInfo);
+  }
+
+  public Value createValue(MoveType moveType) {
+    return createValue(moveType, null);
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index 045a6d0..1b18ccc 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -792,7 +792,7 @@
     return false;
   }
 
-  public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+  public ConstInstruction fold(IRCode code) {
     throw new Unreachable("Unsupported folding for " + this);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java b/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
index dc16d43..52a0f55 100644
--- a/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
@@ -30,13 +30,14 @@
     return leftValue().isConstant() && rightValue().isConstant();
   }
 
-  public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+  @Override
+  public ConstInstruction fold(IRCode code) {
     assert canBeFolded();
     if (type == NumericType.INT) {
       int left = leftValue().getConstInstruction().asConstNumber().getIntValue();
       int right = rightValue().getConstInstruction().asConstNumber().getIntValue();
       int result = foldIntegers(left, right);
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+      Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
       return new ConstNumber(ConstType.INT, value, result);
     } else {
       assert type == NumericType.LONG;
@@ -49,7 +50,7 @@
         right = rightValue().getConstInstruction().asConstNumber().getLongValue();
       }
       long result = foldLongs(left, right);
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+      Value value = code.createValue(MoveType.WIDE, getDebugInfo());
       return new ConstNumber(ConstType.LONG, value, result);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Neg.java b/src/main/java/com/android/tools/r8/ir/code/Neg.java
index 6066439..59022de 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Neg.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Neg.java
@@ -27,24 +27,24 @@
   }
 
   @Override
-  public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+  public ConstInstruction fold(IRCode code) {
     assert canBeFolded();
     if (type == NumericType.INT) {
       int result = -source().getConstInstruction().asConstNumber().getIntValue();
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+      Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
       return new ConstNumber(ConstType.INT, value, result);
     } else if (type == NumericType.LONG) {
       long result = -source().getConstInstruction().asConstNumber().getLongValue();
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+      Value value = code.createValue(MoveType.WIDE, getDebugInfo());
       return new ConstNumber(ConstType.LONG, value, result);
     } else if (type == NumericType.FLOAT) {
       float result = -source().getConstInstruction().asConstNumber().getFloatValue();
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+      Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
       return new ConstNumber(ConstType.FLOAT, value, Float.floatToIntBits(result));
     } else {
       assert type == NumericType.DOUBLE;
       double result = -source().getConstInstruction().asConstNumber().getDoubleValue();
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+      Value value = code.createValue(MoveType.WIDE, getDebugInfo());
       return new ConstNumber(ConstType.DOUBLE, value, Double.doubleToLongBits(result));
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Not.java b/src/main/java/com/android/tools/r8/ir/code/Not.java
index 9e41f3e..cae6118 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Not.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Not.java
@@ -23,16 +23,16 @@
   }
 
   @Override
-  public ConstInstruction fold(ValueNumberGenerator valueNumberGenerator) {
+  public ConstInstruction fold(IRCode code) {
     assert canBeFolded();
     if (type == NumericType.INT) {
       int result = ~(source().getConstInstruction().asConstNumber().getIntValue());
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.SINGLE, getDebugInfo());
+      Value value = code.createValue(MoveType.SINGLE, getDebugInfo());
       return new ConstNumber(ConstType.INT, value, result);
     } else {
       assert type == NumericType.LONG;
       long result = ~source().getConstInstruction().asConstNumber().getLongValue();
-      Value value = new Value(valueNumberGenerator.next(), -1, MoveType.WIDE, getDebugInfo());
+      Value value = code.createValue(MoveType.WIDE, getDebugInfo());
       return new ConstNumber(ConstType.LONG, value, result);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Phi.java b/src/main/java/com/android/tools/r8/ir/code/Phi.java
index 0d74321..5912f0f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Phi.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Phi.java
@@ -34,8 +34,8 @@
   // computation of the phi until all operands are known.
   private MoveType outType = null;
 
-  public Phi(int number, int register, BasicBlock block, MoveType type, DebugLocalInfo local) {
-    super(number, register, type, local == null ? null : new DebugInfo(local, null));
+  public Phi(int number, BasicBlock block, MoveType type, DebugLocalInfo local) {
+    super(number, type, local == null ? null : new DebugInfo(local, null));
     this.block = block;
     block.addPhi(this);
   }
@@ -54,7 +54,7 @@
     return block;
   }
 
-  public void addOperands(IRBuilder builder) {
+  public void addOperands(IRBuilder builder, int register) {
     // Phi operands are only filled in once to complete the phi. Some phis are incomplete for a
     // period of time to break cycles. When the cycle has been resolved they are completed
     // exactly once by adding the operands.
@@ -63,8 +63,7 @@
     for (BasicBlock pred : block.getPredecessors()) {
       EdgeType edgeType = pred.getEdgeType(block);
       // Since this read has been delayed we must provide the local info for the value.
-      Value operand = builder.readRegister(
-          getOriginalRegister(), pred, edgeType, type, getLocalInfo());
+      Value operand = builder.readRegister(register, pred, edgeType, type, getLocalInfo());
       canBeNull |= operand.canBeNull();
       appendOperand(operand);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index 2b7c647..6487631 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -53,11 +53,10 @@
     }
   }
 
-  public static final Value UNDEFINED = new Value(-1, -1, MoveType.OBJECT, null);
+  public static final Value UNDEFINED = new Value(-1, MoveType.OBJECT, null);
 
   protected final int number;
   protected MoveType type;
-  private int originalRegister;
   public Instruction definition = null;
   private LinkedList<Instruction> users = new LinkedList<>();
   private Set<Instruction> uniqueUsers = null;
@@ -73,10 +72,9 @@
   private LongInterval valueRange;
   private DebugData debugData;
 
-  public Value(int number, int originalRegister, MoveType type, DebugInfo debugInfo) {
+  public Value(int number, MoveType type, DebugInfo debugInfo) {
     this.number = number;
     this.type = type;
-    this.originalRegister = originalRegister;
     this.debugData = debugInfo == null ? null : new DebugData(debugInfo);
   }
 
@@ -92,10 +90,6 @@
     return number;
   }
 
-  public int getOriginalRegister() {
-    return originalRegister;
-  }
-
   public int requiredRegisters() {
     return type.requiredRegisters();
   }
@@ -374,26 +368,23 @@
     StringBuilder builder = new StringBuilder();
     builder.append("v");
     builder.append(number);
-    builder.append("(");
-    if (definition != null && isConstant()) {
-      ConstNumber constNumber = getConstInstruction().asConstNumber();
-      if (constNumber.outType() == MoveType.SINGLE) {
-        builder.append((int) constNumber.getRawValue());
-      } else {
-        builder.append(constNumber.getRawValue());
+    boolean isConstant = definition != null && isConstant();
+    boolean hasLocalInfo = getLocalInfo() != null;
+    if (isConstant || hasLocalInfo) {
+      builder.append("(");
+      if (isConstant) {
+        ConstNumber constNumber = getConstInstruction().asConstNumber();
+        if (constNumber.outType() == MoveType.SINGLE) {
+          builder.append((int) constNumber.getRawValue());
+        } else {
+          builder.append(constNumber.getRawValue());
+        }
       }
-    } else {
-      if (originalRegister >= 0) {
-        builder.append("r");
-        builder.append(originalRegister);
-      } else {
-        builder.append("_");
+      if (hasLocalInfo) {
+        builder.append(", ").append(getLocalInfo());
       }
+      builder.append(")");
     }
-    if (getLocalInfo() != null) {
-      builder.append(", ").append(getLocalInfo());
-    }
-    builder.append(")");
     if (valueRange != null) {
       builder.append(valueRange);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index b92ff71..bd8a469 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -1379,7 +1379,7 @@
     Value value;
     if (!block.isSealed()) {
       assert !blocks.isEmpty() : "No write to " + register;
-      Phi phi = new Phi(valueNumberGenerator.next(), register, block, type, local);
+      Phi phi = new Phi(valueNumberGenerator.next(), block, type, local);
       block.addIncompletePhi(register, phi, readingEdge);
       value = phi;
     } else if (block.getPredecessors().size() == 1) {
@@ -1388,11 +1388,11 @@
       EdgeType edgeType = pred.getEdgeType(block);
       value = readRegister(register, pred, edgeType, type, local);
     } else {
-      Phi phi = new Phi(valueNumberGenerator.next(), register, block, type, local);
+      Phi phi = new Phi(valueNumberGenerator.next(), block, type, local);
       // We need to write the phi before adding operands to break cycles. If the phi is trivial
       // and is removed by addOperands, the definition is overwritten and looked up again below.
       block.updateCurrentDefinition(register, phi, readingEdge);
-      phi.addOperands(this);
+      phi.addOperands(this, register);
       // Lookup the value for the register again at this point. Recursive trivial
       // phi removal could have simplified what we wanted to return here.
       value = block.readCurrentDefinition(register, readingEdge);
@@ -1406,7 +1406,7 @@
   }
 
   public Value readLiteral(NumericType type, long constant) {
-    Value value = new Value(valueNumberGenerator.next(), -1, MoveType.fromNumericType(type), null);
+    Value value = new Value(valueNumberGenerator.next(), MoveType.fromNumericType(type), null);
     add(new ConstNumber(ConstType.fromNumericType(type), value, constant));
     return value;
   }
@@ -1415,7 +1415,7 @@
   // See addDebugLocalStart and addDebugLocalEnd.
   private Value writeRegister(int register, MoveType type, ThrowingInfo throwing, DebugInfo info) {
     checkRegister(register);
-    Value value = new Value(valueNumberGenerator.next(), register, type, info);
+    Value value = new Value(valueNumberGenerator.next(), type, info);
     currentBlock.writeCurrentDefinition(register, value, throwing);
     return value;
   }
@@ -1610,7 +1610,7 @@
         MoveType returnType = origReturn.getReturnType();
         assert origReturn.getLocalInfo() == null;
         phi = new Phi(
-            valueNumberGenerator.next(), -1, normalExitBlock, returnValue.outType(), null);
+            valueNumberGenerator.next(), normalExitBlock, returnValue.outType(), null);
         normalExitBlock.add(new Return(phi, returnType));
         assert returnType == MoveType.fromDexType(method.method.proto.returnType);
       }
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 1eb8707..a7c40d1 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
@@ -51,7 +51,7 @@
     if (insn.outValue() == null) {
       return null;
     } else {
-      return new Value(code.valueNumberGenerator.next(), -1, insn.outType(), insn.getDebugInfo());
+      return code.createValue(insn.outType(), insn.getDebugInfo());
     }
   }
 
@@ -105,8 +105,7 @@
             // Fix up the return type if needed.
             if (actualTarget.proto.returnType != invokedMethod.proto.returnType
                 && newInvoke.outValue() != null) {
-              Value newValue = new Value(
-                  code.valueNumberGenerator.next(), -1, newInvoke.outType(), invoke.getDebugInfo());
+              Value newValue = code.createValue(newInvoke.outType(), invoke.getDebugInfo());
               newInvoke.outValue().replaceUsers(newValue);
               CheckCast cast = new CheckCast(
                   newValue,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
index 772d74c..66cd7d9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
@@ -121,6 +121,8 @@
     companionClassFlags.unsetInterface();
     companionClassFlags.setFinal();
     companionClassFlags.setSynthetic();
+    // Companion class must be public so moved methods can be called from anywhere.
+    companionClassFlags.setPublic();
 
     // Create companion class.
     DexType companionClassType = rewriter.getCompanionClassType(iface.type);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index 87241cf..34e60d1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -279,8 +279,7 @@
     Value lambdaInstanceValue = invoke.outValue();
     if (lambdaInstanceValue == null) {
       // The out value might be empty in case it was optimized out.
-      lambdaInstanceValue = new Value(
-          code.valueNumberGenerator.next(), -1, MoveType.OBJECT, null);
+      lambdaInstanceValue = code.createValue(MoveType.OBJECT);
     }
 
     // For stateless lambdas we replace InvokeCustom instruction with StaticGet
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 9034c37..0830209 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
@@ -690,7 +690,7 @@
         Instruction current = iterator.next();
         Instruction folded;
         if (canBeFolded(current)) {
-          folded = current.fold(code.valueNumberGenerator);
+          folded = current.fold(code);
           iterator.replaceCurrentInstruction(folded);
           folded.outValue().uniqueUsers()
               .forEach(instruction -> worklist.add(instruction.getBlock()));
@@ -1228,7 +1228,7 @@
             // Replace call to Throwable::getSuppressed() with new Throwable[0].
 
             // First insert the constant value *before* the current instruction.
-            Value zero = new Value(code.valueNumberGenerator.next(), -1, MoveType.SINGLE, null);
+            Value zero = code.createValue(MoveType.SINGLE);
             assert iterator.hasPrevious();
             iterator.previous();
             iterator.add(new ConstNumber(ConstType.INT, zero, 0));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
index 5842609..b122d23 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
@@ -75,8 +75,7 @@
     MoveType moveType = instruction.outValue().outType();
     if (rule != null && rule.hasReturnValue() && rule.getReturnValue().isSingleValue()) {
       assert moveType != MoveType.OBJECT;
-      Value value = new Value(
-          code.valueNumberGenerator.next(), -1, moveType, instruction.getDebugInfo());
+      Value value = code.createValue(moveType, instruction.getDebugInfo());
       replacement = new ConstNumber(
           ConstType.fromMoveType(moveType), value, rule.getReturnValue().getSingleValue());
     }
@@ -85,8 +84,7 @@
       DexField field = rule.getReturnValue().getField();
       DexEncodedField staticField = appInfo.lookupStaticTarget(field.clazz, field);
       if (staticField != null) {
-        Value value = new Value(
-            code.valueNumberGenerator.next(), -1, moveType, instruction.getDebugInfo());
+        Value value = code.createValue(moveType, instruction.getDebugInfo());
         replacement = staticField.staticValue.asConstInstruction(false, value);
       } else {
         throw new CompilationError(field.clazz.toSourceString() + "." + field.name.toString() +
@@ -171,7 +169,7 @@
                 assert constant == 0;
                 moveType = MoveType.SINGLE;
               }
-              Value value = new Value(code.valueNumberGenerator.next(), -1, moveType, null);
+              Value value = code.createValue(moveType);
               // TODO(ager): Attempt to get a more precise const type from the method analysis?
               Instruction knownConstReturn =
                   new ConstNumber(ConstType.fromMoveType(moveType), value, constant);
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index 3ccf2b3..a981990 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -1726,7 +1726,7 @@
   }
 
   private Value createValue(MoveType type, DebugInfo debugInfo) {
-    Value value = new Value(code.valueNumberGenerator.next(), NO_REGISTER, type, debugInfo);
+    Value value = code.createValue(type, debugInfo);
     value.setNeedsRegister(true);
     return value;
   }
diff --git a/src/test/examplesAndroidN/interfacemethods/DefaultMethods.java b/src/test/examplesAndroidN/interfacemethods/DefaultMethods.java
index ef49f4e..25e3fea 100644
--- a/src/test/examplesAndroidN/interfacemethods/DefaultMethods.java
+++ b/src/test/examplesAndroidN/interfacemethods/DefaultMethods.java
@@ -4,6 +4,8 @@
 
 package interfacemethods;
 
+import interfacemethods.p1.I4;
+
 public class DefaultMethods {
 
   interface I3 {
@@ -22,8 +24,12 @@
   static class C4 extends C3 implements I3 {
   }
 
+  static class C5 implements I4 {
+  }
+
   public static void main(String[] args) {
     new C2().d1();
     System.out.println(new C4().getValue());
+    new C5().dump();
   }
 }
diff --git a/src/test/examplesAndroidN/interfacemethods/p1/I3.java b/src/test/examplesAndroidN/interfacemethods/p1/I3.java
new file mode 100644
index 0000000..f956279
--- /dev/null
+++ b/src/test/examplesAndroidN/interfacemethods/p1/I3.java
@@ -0,0 +1,12 @@
+// 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 interfacemethods.p1;
+
+interface I3 {
+
+  default void dump() {
+    System.out.println("I3");
+  }
+}
diff --git a/src/test/examplesAndroidN/interfacemethods/p1/I4.java b/src/test/examplesAndroidN/interfacemethods/p1/I4.java
new file mode 100644
index 0000000..1bb946b
--- /dev/null
+++ b/src/test/examplesAndroidN/interfacemethods/p1/I4.java
@@ -0,0 +1,8 @@
+// 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 interfacemethods.p1;
+
+public interface I4 extends I3 {
+}
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index db3dce5d..9cffe15 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -77,15 +77,9 @@
   // Set to true to enable verbose logs
   private static final boolean DEBUG_TESTS = false;
 
-  private static final List<DexVm> UNSUPPORTED_ART_VERSIONS = ImmutableList.<DexVm>builder()
-      // Dalvik does not support command ReferenceType.Methods which is used to set breakpoint.
-      // TODO(shertz) use command ReferenceType.MethodsWithGeneric instead
-      .add(DexVm.ART_4_4_4)
-      // Older runtimes fail on buildbot
-      // TODO(shertz) re-enable once issue is solved
-      .add(DexVm.ART_5_1_1)
-      .add(DexVm.ART_6_0_1)
-      .build();
+  // Dalvik does not support command ReferenceType.Methods which is used to set breakpoint.
+  // TODO(shertz) use command ReferenceType.MethodsWithGeneric instead
+  private static final List<DexVm> UNSUPPORTED_ART_VERSIONS = ImmutableList.of(DexVm.ART_4_4_4);
 
   private static final Path JDWP_JAR = ToolHelper
       .getJdwpTestsJarPath(ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm()));
diff --git a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
index 291c2c5..90e2089 100644
--- a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
+++ b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
@@ -355,8 +355,8 @@
     BasicBlock originalReturnBlock = code.getNormalExitBlock();
     BasicBlock newReturnBlock = originalReturnBlock.listIterator().split(code);
     // Modify the code to make the inserted block add the constant 10 to the original return value.
-    Value newConstValue = new Value(test.valueNumberGenerator.next(), -1, MoveType.SINGLE, null);
-    Value newReturnValue = new Value(test.valueNumberGenerator.next(), -1, MoveType.SINGLE, null);
+    Value newConstValue = new Value(test.valueNumberGenerator.next(), MoveType.SINGLE, null);
+    Value newReturnValue = new Value(test.valueNumberGenerator.next(), MoveType.SINGLE, null);
     Value oldReturnValue = newReturnBlock.listIterator().next().asReturn().returnValue();
     newReturnBlock.listIterator().next().asReturn().returnValue().replaceUsers(newReturnValue);
     Instruction constInstruction = new ConstNumber(ConstType.INT, newConstValue, 10);
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
index 7eebf9b..0df0031 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
@@ -41,13 +41,13 @@
   @Test
   public void equalityOfConstantOperands() {
     RegisterAllocator allocator = new MockRegisterAllocator();
-    Value value0 = new Value(0, -1, MoveType.SINGLE, null);
+    Value value0 = new Value(0, MoveType.SINGLE, null);
     ConstNumber const0 = new ConstNumber(ConstType.INT, value0, 0);
-    Value value1 = new Value(1, -1, MoveType.SINGLE, null);
+    Value value1 = new Value(1, MoveType.SINGLE, null);
     ConstNumber const1 = new ConstNumber(ConstType.INT, value1, 1);
-    Value value2 = new Value(2, -1, MoveType.SINGLE, null);
+    Value value2 = new Value(2, MoveType.SINGLE, null);
     ConstNumber const2 = new ConstNumber(ConstType.INT, value2, 2);
-    Value value3 = new Value(2, -1, MoveType.SINGLE, null);
+    Value value3 = new Value(2, MoveType.SINGLE, null);
     Add add0 = new Add(NumericType.INT, value3, value0, value1);
     Add add1 = new Add(NumericType.INT, value3, value0, value2);
     value0.computeNeedsRegister();
