diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java b/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
index 5613421..1d51bab 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
@@ -4,15 +4,15 @@
 package com.android.tools.r8.cf.code;
 
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.ir.code.ConstType;
+import com.android.tools.r8.ir.code.ValueType;
 import org.objectweb.asm.MethodVisitor;
 
 public class CfConstNumber extends CfInstruction {
 
   private final long value;
-  private final ConstType type;
+  private final ValueType type;
 
-  public CfConstNumber(long value, ConstType type) {
+  public CfConstNumber(long value, ValueType type) {
     this.value = value;
     this.type = type;
   }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLoad.java b/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
index 0d63eaf..af053a8 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
@@ -4,25 +4,25 @@
 package com.android.tools.r8.cf.code;
 
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
+import com.android.tools.r8.ir.code.ValueType;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 
 public class CfLoad extends CfInstruction {
 
   private final int var;
-  private final LocalType type;
+  private final ValueType type;
 
-  public CfLoad(LocalType type, int var) {
+  public CfLoad(ValueType type, int var) {
     this.var = var;
     this.type = type;
   }
 
   private int getLoadType() {
     switch (type) {
-      case REFERENCE:
+      case OBJECT:
         return Opcodes.ALOAD;
-      case INTEGER:
+      case INT:
         return Opcodes.ILOAD;
       case FLOAT:
         return Opcodes.FLOAD;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStore.java b/src/main/java/com/android/tools/r8/cf/code/CfStore.java
index c18ae55..0074abc 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfStore.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfStore.java
@@ -4,25 +4,25 @@
 package com.android.tools.r8.cf.code;
 
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
+import com.android.tools.r8.ir.code.ValueType;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 
 public class CfStore extends CfInstruction {
 
   private final int var;
-  private final LocalType type;
+  private final ValueType type;
 
-  public CfStore(LocalType type, int var) {
+  public CfStore(ValueType type, int var) {
     this.var = var;
     this.type = type;
   }
 
   private int getStoreType() {
     switch (type) {
-      case REFERENCE:
+      case OBJECT:
         return Opcodes.ASTORE;
-      case INTEGER:
+      case INT:
         return Opcodes.ISTORE;
       case FLOAT:
         return Opcodes.FSTORE;
diff --git a/src/main/java/com/android/tools/r8/code/Const.java b/src/main/java/com/android/tools/r8/code/Const.java
index 4976dc2..7f9d8b8 100644
--- a/src/main/java/com/android/tools/r8/code/Const.java
+++ b/src/main/java/com/android/tools/r8/code/Const.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.SingleConstant;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(MoveType.SINGLE, AA, decodedValue());
+    builder.addConst(ValueType.INT_OR_FLOAT, AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Const16.java b/src/main/java/com/android/tools/r8/code/Const16.java
index b63844c..baa51ea 100644
--- a/src/main/java/com/android/tools/r8/code/Const16.java
+++ b/src/main/java/com/android/tools/r8/code/Const16.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.SingleConstant;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
@@ -51,6 +51,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(MoveType.SINGLE, AA, decodedValue());
+    builder.addConst(ValueType.INT_OR_FLOAT, AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Const4.java b/src/main/java/com/android/tools/r8/code/Const4.java
index f1c80a8..31364ea 100644
--- a/src/main/java/com/android/tools/r8/code/Const4.java
+++ b/src/main/java/com/android/tools/r8/code/Const4.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.SingleConstant;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(MoveType.SINGLE, A, decodedValue());
+    builder.addConst(ValueType.INT_OR_FLOAT, A, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstHigh16.java b/src/main/java/com/android/tools/r8/code/ConstHigh16.java
index a28bfbc..6cf0851 100644
--- a/src/main/java/com/android/tools/r8/code/ConstHigh16.java
+++ b/src/main/java/com/android/tools/r8/code/ConstHigh16.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.SingleConstant;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(MoveType.SINGLE, AA, decodedValue());
+    builder.addConst(ValueType.INT_OR_FLOAT, AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide.java b/src/main/java/com/android/tools/r8/code/ConstWide.java
index bf26761..509b00b 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide.java
+++ b/src/main/java/com/android/tools/r8/code/ConstWide.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(MoveType.WIDE, AA, decodedValue());
+    builder.addConst(ValueType.LONG_OR_DOUBLE, AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide16.java b/src/main/java/com/android/tools/r8/code/ConstWide16.java
index d416c43..4b74eb4 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide16.java
+++ b/src/main/java/com/android/tools/r8/code/ConstWide16.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(MoveType.WIDE, AA, decodedValue());
+    builder.addConst(ValueType.LONG_OR_DOUBLE, AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide32.java b/src/main/java/com/android/tools/r8/code/ConstWide32.java
index bc564dd..f09fd14 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide32.java
+++ b/src/main/java/com/android/tools/r8/code/ConstWide32.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(MoveType.WIDE, AA, decodedValue());
+    builder.addConst(ValueType.LONG_OR_DOUBLE, AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java b/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java
index ceb154b..762e2ee 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java
+++ b/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(MoveType.WIDE, AA, decodedValue());
+    builder.addConst(ValueType.LONG_OR_DOUBLE, AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Move.java b/src/main/java/com/android/tools/r8/code/Move.java
index 2efffb7..0dc06f9 100644
--- a/src/main/java/com/android/tools/r8/code/Move.java
+++ b/src/main/java/com/android/tools/r8/code/Move.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class Move extends Format12x {
@@ -37,6 +37,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.SINGLE, A, B);
+    builder.addMove(ValueType.INT_OR_FLOAT, A, B);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Move16.java b/src/main/java/com/android/tools/r8/code/Move16.java
index b061674..aae6740 100644
--- a/src/main/java/com/android/tools/r8/code/Move16.java
+++ b/src/main/java/com/android/tools/r8/code/Move16.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 public class Move16 extends Format32x {
 
@@ -36,6 +36,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.SINGLE, AAAA, BBBB);
+    builder.addMove(ValueType.INT_OR_FLOAT, AAAA, BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveFrom16.java b/src/main/java/com/android/tools/r8/code/MoveFrom16.java
index 28d5463..7d33a0b 100644
--- a/src/main/java/com/android/tools/r8/code/MoveFrom16.java
+++ b/src/main/java/com/android/tools/r8/code/MoveFrom16.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 public class MoveFrom16 extends Format22x {
 
@@ -36,6 +36,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.SINGLE, AA, BBBB);
+    builder.addMove(ValueType.INT_OR_FLOAT, AA, BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveObject.java b/src/main/java/com/android/tools/r8/code/MoveObject.java
index fde4992..a308ab1 100644
--- a/src/main/java/com/android/tools/r8/code/MoveObject.java
+++ b/src/main/java/com/android/tools/r8/code/MoveObject.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class MoveObject extends Format12x {
@@ -37,6 +37,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.OBJECT, A, B);
+    builder.addMove(ValueType.OBJECT, A, B);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveObject16.java b/src/main/java/com/android/tools/r8/code/MoveObject16.java
index 481bdfc..a7eb12c 100644
--- a/src/main/java/com/android/tools/r8/code/MoveObject16.java
+++ b/src/main/java/com/android/tools/r8/code/MoveObject16.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class MoveObject16 extends Format32x {
@@ -37,6 +37,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.OBJECT, AAAA, BBBB);
+    builder.addMove(ValueType.OBJECT, AAAA, BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java b/src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java
index 71d4ca8..8b32125 100644
--- a/src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java
+++ b/src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 public class MoveObjectFrom16 extends Format22x {
 
@@ -36,6 +36,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.OBJECT, AA, BBBB);
+    builder.addMove(ValueType.OBJECT, AA, BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveResult.java b/src/main/java/com/android/tools/r8/code/MoveResult.java
index 5d8ce33..6b75941 100644
--- a/src/main/java/com/android/tools/r8/code/MoveResult.java
+++ b/src/main/java/com/android/tools/r8/code/MoveResult.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 public class MoveResult extends Format11x {
 
@@ -36,6 +36,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMoveResult(MoveType.SINGLE, AA);
+    builder.addMoveResult(ValueType.INT_OR_FLOAT, AA);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveResultObject.java b/src/main/java/com/android/tools/r8/code/MoveResultObject.java
index 1c01c99..a3334b8 100644
--- a/src/main/java/com/android/tools/r8/code/MoveResultObject.java
+++ b/src/main/java/com/android/tools/r8/code/MoveResultObject.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class MoveResultObject extends Format11x {
@@ -37,6 +37,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMoveResult(MoveType.OBJECT, AA);
+    builder.addMoveResult(ValueType.OBJECT, AA);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveResultWide.java b/src/main/java/com/android/tools/r8/code/MoveResultWide.java
index 143a256..92dde3e 100644
--- a/src/main/java/com/android/tools/r8/code/MoveResultWide.java
+++ b/src/main/java/com/android/tools/r8/code/MoveResultWide.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class MoveResultWide extends Format11x {
@@ -37,6 +37,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMoveResult(MoveType.WIDE, AA);
+    builder.addMoveResult(ValueType.LONG_OR_DOUBLE, AA);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveType.java b/src/main/java/com/android/tools/r8/code/MoveType.java
new file mode 100644
index 0000000..6ade361
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/code/MoveType.java
@@ -0,0 +1,47 @@
+// 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.code;
+
+import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.ir.code.ValueType;
+
+public enum  MoveType {
+  SINGLE,
+  WIDE,
+  OBJECT;
+
+  public static MoveType fromValueType(ValueType type) {
+    switch (type) {
+      case OBJECT:
+        return OBJECT;
+      case INT:
+      case FLOAT:
+      case INT_OR_FLOAT:
+        return SINGLE;
+      case LONG:
+      case DOUBLE:
+      case LONG_OR_DOUBLE:
+        return WIDE;
+      default:
+        throw new Unreachable("Unexpected value type: " + type);
+    }
+  }
+
+  public ValueType toValueType() {
+    switch (this) {
+      case SINGLE:
+        return ValueType.INT_OR_FLOAT;
+      case WIDE:
+        return ValueType.LONG_OR_DOUBLE;
+      case OBJECT:
+        return ValueType.OBJECT;
+      default:
+        throw new Unreachable("Unexpected move type: " + this);
+    }
+  }
+
+  public int requiredRegisters() {
+    return this == WIDE ? 2 : 1;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/code/MoveWide.java b/src/main/java/com/android/tools/r8/code/MoveWide.java
index 2907fda..d6d1cb2 100644
--- a/src/main/java/com/android/tools/r8/code/MoveWide.java
+++ b/src/main/java/com/android/tools/r8/code/MoveWide.java
@@ -3,8 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
+
 public class MoveWide extends Format12x {
 
   public static final int OPCODE = 0x4;
@@ -36,6 +37,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.WIDE, A, B);
+    builder.addMove(ValueType.LONG_OR_DOUBLE, A, B);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveWide16.java b/src/main/java/com/android/tools/r8/code/MoveWide16.java
index 9cb519f..d128b8e 100644
--- a/src/main/java/com/android/tools/r8/code/MoveWide16.java
+++ b/src/main/java/com/android/tools/r8/code/MoveWide16.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 public class MoveWide16 extends Format32x {
 
@@ -36,6 +36,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.WIDE, AAAA, BBBB);
+    builder.addMove(ValueType.LONG_OR_DOUBLE, AAAA, BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/MoveWideFrom16.java b/src/main/java/com/android/tools/r8/code/MoveWideFrom16.java
index 0688a7f..bb248d0 100644
--- a/src/main/java/com/android/tools/r8/code/MoveWideFrom16.java
+++ b/src/main/java/com/android/tools/r8/code/MoveWideFrom16.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 public class MoveWideFrom16 extends Format22x {
 
@@ -36,6 +36,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMove(MoveType.WIDE, AA, BBBB);
+    builder.addMove(ValueType.LONG_OR_DOUBLE, AA, BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Return.java b/src/main/java/com/android/tools/r8/code/Return.java
index 7215eff..8efab4d 100644
--- a/src/main/java/com/android/tools/r8/code/Return.java
+++ b/src/main/java/com/android/tools/r8/code/Return.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class Return extends Format11x {
@@ -42,6 +42,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addReturn(MoveType.SINGLE, AA);
+    builder.addReturn(ValueType.INT_OR_FLOAT, AA);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ReturnObject.java b/src/main/java/com/android/tools/r8/code/ReturnObject.java
index 3d752c0..c5726df 100644
--- a/src/main/java/com/android/tools/r8/code/ReturnObject.java
+++ b/src/main/java/com/android/tools/r8/code/ReturnObject.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class ReturnObject extends Format11x {
@@ -42,6 +42,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addReturn(MoveType.OBJECT, AA);
+    builder.addReturn(ValueType.OBJECT, AA);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ReturnWide.java b/src/main/java/com/android/tools/r8/code/ReturnWide.java
index b8237fb..f204e16 100644
--- a/src/main/java/com/android/tools/r8/code/ReturnWide.java
+++ b/src/main/java/com/android/tools/r8/code/ReturnWide.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class ReturnWide extends Format11x {
@@ -42,6 +42,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addReturn(MoveType.WIDE, AA);
+    builder.addReturn(ValueType.LONG_OR_DOUBLE, AA);
   }
 }
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
index 7bfa534..c51e6e3 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.google.common.collect.ImmutableMap;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceArrayMap;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
@@ -69,7 +69,7 @@
       DexString name = factory.thisName;
       DexType type = method.method.getHolder();
       startArgument(argumentRegister, name, type);
-      argumentRegister += MoveType.fromDexType(type).requiredRegisters();
+      argumentRegister += ValueType.fromDexType(type).requiredRegisters();
     }
     DexType[] types = method.method.proto.parameters.values;
     DexString[] names = info.parameters;
@@ -78,7 +78,7 @@
       if (names[i] != null) {
         startArgument(argumentRegister, names[i], types[i]);
       }
-      argumentRegister += MoveType.fromDexType(types[i]).requiredRegisters();
+      argumentRegister += ValueType.fromDexType(types[i]).requiredRegisters();
     }
     currentLine = info.startLine;
     for (DexDebugEvent event : info.events) {
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 8b5b0a6..c8932be 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -24,8 +24,8 @@
 import com.android.tools.r8.dex.MixedSectionCollection;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Invoke;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.ValueNumberGenerator;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.DexBuilder;
 import com.android.tools.r8.ir.optimize.Inliner.Constraint;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
@@ -391,7 +391,7 @@
     }
     int requiredArgRegisters = accessFlags.isStatic() ? 0 : 1;
     for (DexType type : method.proto.parameters.values) {
-      requiredArgRegisters += MoveType.fromDexType(type).requiredRegisters();
+      requiredArgRegisters += ValueType.fromDexType(type).requiredRegisters();
     }
     // Passing null as highestSortingString is save, as ConstString instructions are not allowed.
     return new DexCode(Math.max(numberOfRegisters, requiredArgRegisters), requiredArgRegisters,
diff --git a/src/main/java/com/android/tools/r8/graph/DexValue.java b/src/main/java/com/android/tools/r8/graph/DexValue.java
index 415775d..48dc873 100644
--- a/src/main/java/com/android/tools/r8/graph/DexValue.java
+++ b/src/main/java/com/android/tools/r8/graph/DexValue.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.dex.MixedSectionCollection;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.code.ConstNumber;
-import com.android.tools.r8.ir.code.ConstType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.utils.EncodedValueUtils;
@@ -234,7 +234,7 @@
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
       return (this == DEFAULT && hasClassInitializer)
           ? null
-          : new ConstNumber(ConstType.INT, dest, value);
+          : new ConstNumber(ValueType.INT, dest, value);
     }
   }
 
@@ -282,7 +282,7 @@
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
       return (this == DEFAULT && hasClassInitializer)
           ? null
-          : new ConstNumber(ConstType.INT, dest, value);
+          : new ConstNumber(ValueType.INT, dest, value);
     }
   }
 
@@ -334,7 +334,7 @@
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
       return (this == DEFAULT && hasClassInitializer)
           ? null
-          : new ConstNumber(ConstType.INT, dest, value);
+          : new ConstNumber(ValueType.INT, dest, value);
     }
   }
 
@@ -382,7 +382,7 @@
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
       return (this == DEFAULT && hasClassInitializer)
           ? null
-          : new ConstNumber(ConstType.INT, dest, value);
+          : new ConstNumber(ValueType.INT, dest, value);
     }
   }
 
@@ -430,7 +430,7 @@
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
       return (this == DEFAULT && hasClassInitializer)
           ? null
-          : new ConstNumber(ConstType.LONG, dest, value);
+          : new ConstNumber(ValueType.LONG, dest, value);
     }
   }
 
@@ -869,7 +869,7 @@
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
       return (this == DEFAULT && hasClassInitializer)
           ? null
-          : new ConstNumber(ConstType.INT, dest, value ? 1 : 0);
+          : new ConstNumber(ValueType.INT, dest, value ? 1 : 0);
     }
   }
 
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 20a7580..957c092 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
@@ -60,27 +60,27 @@
       int left = leftValue().getConstInstruction().asConstNumber().getIntValue();
       int right = rightValue().getConstInstruction().asConstNumber().getIntValue();
       int result = foldIntegers(left, right);
-      Value value = code.createValue(MoveType.SINGLE, getLocalInfo());
-      return new ConstNumber(ConstType.INT, value, result);
+      Value value = code.createValue(ValueType.INT, getLocalInfo());
+      return new ConstNumber(ValueType.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 = code.createValue(MoveType.WIDE, getLocalInfo());
-      return new ConstNumber(ConstType.LONG, value, result);
+      Value value = code.createValue(ValueType.LONG, getLocalInfo());
+      return new ConstNumber(ValueType.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 = code.createValue(MoveType.SINGLE, getLocalInfo());
-      return new ConstNumber(ConstType.FLOAT, value, Float.floatToIntBits(result));
+      Value value = code.createValue(ValueType.FLOAT, getLocalInfo());
+      return new ConstNumber(ValueType.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 = code.createValue(MoveType.WIDE, getLocalInfo());
-      return new ConstNumber(ConstType.DOUBLE, value, Double.doubleToLongBits(result));
+      Value value = code.createValue(ValueType.DOUBLE, getLocalInfo());
+      return new ConstNumber(ValueType.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 37b3119..974f425 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
@@ -1257,7 +1257,7 @@
       newBlock.setNumber(nextBlockNumber++);
       newPredecessors.add(newBlock);
       if (hasMoveException) {
-        Value value = new Value(valueNumberGenerator.next(), MoveType.OBJECT, move.getLocalInfo());
+        Value value = new Value(valueNumberGenerator.next(), ValueType.OBJECT, move.getLocalInfo());
         values.add(value);
         MoveException newMove = new MoveException(value);
         newBlock.add(newMove);
@@ -1277,7 +1277,7 @@
     // Insert a phi for the move-exception value.
     if (hasMoveException) {
       Phi phi = new Phi(valueNumberGenerator.next(),
-          this, MoveType.OBJECT, move.getLocalInfo());
+          this, ValueType.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 7bf8ec1..b089e46 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
@@ -365,7 +365,7 @@
       if ((i == 0) && (downcast != null)) {
         Value invokeValue = invoke.inValues().get(0);
         Value receiverValue = arguments.get(0);
-        Value value = code.createValue(MoveType.OBJECT);
+        Value value = code.createValue(ValueType.OBJECT);
         castInstruction = new CheckCast(value, invokeValue, downcast);
         castInstruction.setPosition(invoke.getPosition());
         receiverValue.replaceUsers(value);
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 09c1dd6..a39e268 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
@@ -180,8 +180,8 @@
       }
     }
     assert result == -1 || result == 0 || result == 1;
-    Value value = code.createValue(MoveType.SINGLE, getLocalInfo());
-    return new ConstNumber(ConstType.INT, value, result);
+    Value value = code.createValue(ValueType.INT, getLocalInfo());
+    return new ConstNumber(ValueType.INT, value, result);
   }
 
   @Override
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 22374a5..fa49996 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
@@ -14,17 +14,16 @@
 import com.android.tools.r8.code.ConstWideHigh16;
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.ir.conversion.CfBuilder;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
 import com.android.tools.r8.ir.conversion.CfBuilder.StackHelper;
 import com.android.tools.r8.ir.conversion.DexBuilder;
 import com.android.tools.r8.utils.NumberUtils;
 
 public class ConstNumber extends ConstInstruction {
 
-  public final ConstType type;
+  public final ValueType type;
   private final long value;
 
-  public ConstNumber(ConstType type, Value dest, long value) {
+  public ConstNumber(ValueType type, Value dest, long value) {
     super(dest);
     // We create const numbers after register allocation for rematerialization of values. Those
     // are all for fixed register values. All other values that are used as the destination for
@@ -41,7 +40,7 @@
   }
 
   private boolean preciseTypeUnknown() {
-    return type == ConstType.INT_OR_FLOAT || type == ConstType.LONG_OR_DOUBLE;
+    return type == ValueType.INT_OR_FLOAT || type == ValueType.LONG_OR_DOUBLE;
   }
 
   public Value dest() {
@@ -53,22 +52,22 @@
   }
 
   public int getIntValue() {
-    assert type == ConstType.INT || type == ConstType.INT_OR_FLOAT || type == ConstType.OBJECT;
+    assert type == ValueType.INT || type == ValueType.INT_OR_FLOAT || type == ValueType.OBJECT;
     return (int) value;
   }
 
   public long getLongValue() {
-    assert type == ConstType.LONG || type == ConstType.LONG_OR_DOUBLE;
+    assert type == ValueType.LONG || type == ValueType.LONG_OR_DOUBLE;
     return value;
   }
 
   public float getFloatValue() {
-    assert type == ConstType.FLOAT || type == ConstType.INT_OR_FLOAT;
+    assert type == ValueType.FLOAT || type == ValueType.INT_OR_FLOAT;
     return Float.intBitsToFloat((int) value);
   }
 
   public double getDoubleValue() {
-    assert type == ConstType.DOUBLE || type == ConstType.LONG_OR_DOUBLE;
+    assert type == ValueType.DOUBLE || type == ValueType.LONG_OR_DOUBLE;
     return Double.longBitsToDouble(value);
   }
 
@@ -81,11 +80,11 @@
   }
 
   public boolean isIntegerZero() {
-    return type == ConstType.INT && getIntValue() == 0;
+    return type == ValueType.INT && getIntValue() == 0;
   }
 
   public boolean isIntegerOne() {
-    return type == ConstType.INT && getIntValue() == 1;
+    return type == ValueType.INT && getIntValue() == 1;
   }
 
   public boolean isIntegerNegativeOne(NumericType type) {
@@ -105,7 +104,7 @@
     }
 
     int register = builder.allocatedRegister(dest(), getNumber());
-    if (MoveType.fromConstType(type) == MoveType.SINGLE || type == ConstType.OBJECT) {
+    if (type.isSingle() || type.isObject()) {
       assert NumberUtils.is32Bit(value);
       if ((register & 0xf) == register && NumberUtils.is4Bit(value)) {
         builder.add(this, new Const4(register, (int) value));
@@ -117,7 +116,7 @@
         builder.add(this, new Const(register, (int) value));
       }
     } else {
-      assert MoveType.fromConstType(type) == MoveType.WIDE;
+      assert type.isWide();
       if (NumberUtils.is16Bit(value)) {
         builder.add(this, new ConstWide16(register, (int) value));
       } else if ((value & 0x0000ffffffffffffL) == 0) {
@@ -132,17 +131,17 @@
 
   @Override
   public void insertLoadAndStores(InstructionListIterator it, StackHelper stack) {
-    stack.storeOutValue(this, LocalType.fromConstType(type), it);
+    stack.storeOutValue(this, it);
   }
 
   @Override
   public void buildCf(CfBuilder builder) {
-    builder.add(new CfConstNumber(value, type));
+    builder.add(new CfConstNumber(value, outType()));
   }
 
   // Estimated size of the resulting dex instruction in code units.
-  public static int estimatedDexSize(ConstType type, long value) {
-    if (MoveType.fromConstType(type) == MoveType.SINGLE) {
+  public static int estimatedDexSize(ValueType type, long value) {
+    if (type.isSingle()) {
       assert NumberUtils.is32Bit(value);
       if (NumberUtils.is4Bit(value)) {
         return Const4.SIZE;
@@ -154,7 +153,7 @@
         return Const.SIZE;
       }
     } else {
-      assert MoveType.fromConstType(type) == MoveType.WIDE;
+      assert type.isWide();
       if (NumberUtils.is16Bit(value)) {
         return ConstWide16.SIZE;
       } else if ((value & 0x0000ffffffffffffL) == 0) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstString.java b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
index fe90f84..5ddca3f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.ir.conversion.CfBuilder;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
 import com.android.tools.r8.ir.conversion.CfBuilder.StackHelper;
 import com.android.tools.r8.ir.conversion.DexBuilder;
 
@@ -84,7 +83,7 @@
 
   @Override
   public void insertLoadAndStores(InstructionListIterator it, StackHelper stack) {
-    stack.storeOutValue(this, LocalType.REFERENCE, it);
+    stack.storeOutValue(this, it);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstType.java b/src/main/java/com/android/tools/r8/ir/code/ConstType.java
deleted file mode 100644
index c6f9d73..0000000
--- a/src/main/java/com/android/tools/r8/ir/code/ConstType.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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.code;
-
-import com.android.tools.r8.errors.Unreachable;
-
-public enum ConstType {
-  INT,
-  LONG,
-  FLOAT,
-  DOUBLE,
-  OBJECT,
-  INT_OR_FLOAT,
-  LONG_OR_DOUBLE;
-
-  public static ConstType fromNumericType(NumericType type) {
-    switch (type) {
-      case BYTE:
-      case CHAR:
-      case SHORT:
-      case INT:
-        return INT;
-      case LONG:
-        return LONG;
-      case FLOAT:
-        return FLOAT;
-      case DOUBLE:
-        return DOUBLE;
-      default:
-        throw new Unreachable("Invalid numeric type '" + type + "'");
-    }
-  }
-
-  public static ConstType fromMoveType(MoveType moveType) {
-    switch (moveType) {
-      case SINGLE:
-        return INT_OR_FLOAT;
-      case WIDE:
-        return LONG_OR_DOUBLE;
-      case OBJECT:
-        // Currently constants never have type OBJECT even when it is the null object.
-        return INT;
-      default:
-        throw new Unreachable("Invalid move type '" + moveType + "'");
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalUninitialized.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalUninitialized.java
index beaf508..fb86708 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalUninitialized.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalUninitialized.java
@@ -17,8 +17,8 @@
  */
 public class DebugLocalUninitialized extends ConstNumber {
 
-  public DebugLocalUninitialized(ConstType type, Value value) {
-    super(type == ConstType.OBJECT ? ConstType.INT : type, value, 0);
+  public DebugLocalUninitialized(ValueType type, Value value) {
+    super(type == ValueType.OBJECT ? ValueType.INT : type, value, 0);
   }
 
   @Override
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 c5a7bbb..c0e156c 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
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.code;
 
+import com.android.tools.r8.code.MoveType;
+
 // Value that has a fixed register allocated. These are used for inserting spill, restore, and phi
 // moves in the spilling register allocator.
 public class FixedRegisterValue extends Value {
@@ -10,7 +12,7 @@
 
   public FixedRegisterValue(MoveType type, int register) {
     // Set local info to null since these values are never representatives of live-ranges.
-    super(-1, type, null);
+    super(-1, type.toValueType(), 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 e5fb6ed..490370e 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
@@ -473,24 +473,24 @@
     return arguments;
   }
 
-  public Value createValue(MoveType moveType, DebugLocalInfo local) {
-    return new Value(valueNumberGenerator.next(), moveType, local);
+  public Value createValue(ValueType valueType, DebugLocalInfo local) {
+    return new Value(valueNumberGenerator.next(), valueType, local);
   }
 
-  public Value createValue(MoveType moveType) {
-    return createValue(moveType, null);
+  public Value createValue(ValueType valueType) {
+    return createValue(valueType, null);
   }
 
   public ConstNumber createIntConstant(int value) {
-    return new ConstNumber(ConstType.INT, createValue(MoveType.SINGLE), value);
+    return new ConstNumber(ValueType.INT, createValue(ValueType.INT), value);
   }
 
   public ConstNumber createTrue() {
-    return new ConstNumber(ConstType.INT, createValue(MoveType.SINGLE), 1);
+    return new ConstNumber(ValueType.INT, createValue(ValueType.INT), 1);
   }
 
   public ConstNumber createFalse() {
-    return new ConstNumber(ConstType.INT, createValue(MoveType.SINGLE), 0);
+    return new ConstNumber(ValueType.INT, createValue(ValueType.INT), 0);
   }
 
   public final int getHighestBlockNumber() {
@@ -499,7 +499,7 @@
 
   public Instruction createConstNull(Instruction from) {
     Value newValue = createValue(from.outType());
-    return new ConstNumber(ConstType.fromMoveType(from.outType()), newValue, 0);
+    return new ConstNumber(from.outType(), newValue, 0);
   }
 
   public boolean doAllThrowingInstructionsHavePositions() {
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 6e5a893..e7b82d6 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
@@ -127,7 +127,7 @@
     }
   }
 
-  public final MoveType outType() {
+  public final ValueType outType() {
     return outValue.outType();
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/Invoke.java b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
index 14104d7..bdbcc5a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Invoke.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.code.MoveResult;
 import com.android.tools.r8.code.MoveResultObject;
 import com.android.tools.r8.code.MoveResultWide;
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
@@ -137,9 +138,10 @@
 
   protected void addInvokeAndMoveResult(com.android.tools.r8.code.Instruction instruction, DexBuilder builder) {
     if (outValue != null && outValue.needsRegister()) {
+      MoveType moveType = MoveType.fromValueType(outType());
       int register = builder.allocatedRegister(outValue, getNumber());
       com.android.tools.r8.code.Instruction moveResult;
-      switch (outType()) {
+      switch (moveType) {
         case SINGLE:
           moveResult = new MoveResult(register);
           break;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
index 75a449b..ff4d876 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
@@ -9,12 +9,10 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
 import com.android.tools.r8.ir.conversion.CfBuilder.StackHelper;
 import com.android.tools.r8.ir.optimize.Inliner.Constraint;
 import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
 import com.android.tools.r8.ir.optimize.InliningOracle;
-import java.util.ArrayList;
 import java.util.List;
 
 public abstract class InvokeMethod extends Invoke {
@@ -82,25 +80,14 @@
 
   @Override
   public void insertLoadAndStores(InstructionListIterator it, StackHelper stack) {
-    List<LocalType> types;
-    if (isInvokeMethodWithReceiver()) {
-      types = new ArrayList<>(method.getArity() + 1);
-      types.add(LocalType.REFERENCE);
-    } else {
-      types = new ArrayList<>(method.getArity());
-    }
-    for (DexType type : method.proto.parameters.values) {
-      types.add(LocalType.fromDexType(type));
-    }
-    stack.loadInValues(this, inValues, types, it);
+    stack.loadInValues(this, it);
     if (method.proto.returnType.isVoidType()) {
       return;
     }
     if (outValue == null) {
-      stack.popOutValue(this, MoveType.fromDexType(method.proto.returnType), it);
+      stack.popOutValue(this, it);
     } else {
-      LocalType returnType = LocalType.fromDexType(getInvokedMethod().proto.returnType);
-      stack.storeOutValue(this, returnType, it);
+      stack.storeOutValue(this, it);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Load.java b/src/main/java/com/android/tools/r8/ir/code/Load.java
index e82149a..a8bb95c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Load.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Load.java
@@ -8,16 +8,12 @@
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.conversion.CfBuilder;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
 import com.android.tools.r8.ir.optimize.Inliner.Constraint;
 
 public class Load extends Instruction {
 
-  private final LocalType type;
-
-  public Load(LocalType type, StackValue dest, Value src) {
+  public Load(StackValue dest, Value src) {
     super(dest, src);
-    this.type = type;
   }
 
   @Override
@@ -48,6 +44,6 @@
   @Override
   public void buildCf(CfBuilder builder) {
     Value value = inValues.get(0);
-    builder.add(new CfLoad(type, value.getNumber()));
+    builder.add(new CfLoad(value.outType(), value.getNumber()));
   }
 }
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 3d6a3a0..2481025 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
@@ -37,8 +37,8 @@
       int left = leftValue().getConstInstruction().asConstNumber().getIntValue();
       int right = rightValue().getConstInstruction().asConstNumber().getIntValue();
       int result = foldIntegers(left, right);
-      Value value = code.createValue(MoveType.SINGLE, getLocalInfo());
-      return new ConstNumber(ConstType.INT, value, result);
+      Value value = code.createValue(ValueType.INT, getLocalInfo());
+      return new ConstNumber(ValueType.INT, value, result);
     } else {
       assert type == NumericType.LONG;
       long left = leftValue().getConstInstruction().asConstNumber().getLongValue();
@@ -50,8 +50,8 @@
         right = rightValue().getConstInstruction().asConstNumber().getLongValue();
       }
       long result = foldLongs(left, right);
-      Value value = code.createValue(MoveType.WIDE, getLocalInfo());
-      return new ConstNumber(ConstType.LONG, value, result);
+      Value value = code.createValue(ValueType.LONG, getLocalInfo());
+      return new ConstNumber(ValueType.LONG, value, result);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/MemberType.java b/src/main/java/com/android/tools/r8/ir/code/MemberType.java
index 5a992ab..28ae7ac 100644
--- a/src/main/java/com/android/tools/r8/ir/code/MemberType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/MemberType.java
@@ -17,18 +17,19 @@
   CHAR,
   SHORT;
 
-  public static MoveType moveTypeFor(MemberType type) {
+  public static ValueType moveTypeFor(MemberType type) {
     switch (type) {
       case BOOLEAN:
       case BYTE:
       case CHAR:
       case SHORT:
+        return ValueType.INT;
       case SINGLE:
-        return MoveType.SINGLE;
+        return ValueType.INT_OR_FLOAT;
       case WIDE:
-        return MoveType.WIDE;
+        return ValueType.LONG_OR_DOUBLE;
       case OBJECT:
-        return MoveType.OBJECT;
+        return ValueType.OBJECT;
     }
     return null;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/MoveType.java b/src/main/java/com/android/tools/r8/ir/code/MoveType.java
deleted file mode 100644
index 18f5632..0000000
--- a/src/main/java/com/android/tools/r8/ir/code/MoveType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2016, 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.code;
-
-import com.android.tools.r8.errors.InternalCompilerError;
-import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.DexType;
-
-public enum MoveType {
-  SINGLE,
-  WIDE,
-  OBJECT;
-
-  public int requiredRegisters() {
-    return this == MoveType.WIDE ? 2 : 1;
-  }
-
-  public static MoveType fromMemberType(MemberType type) {
-    switch (type) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case SHORT:
-      case SINGLE:
-        return MoveType.SINGLE;
-      case WIDE:
-        return MoveType.WIDE;
-      case OBJECT:
-        return MoveType.OBJECT;
-    }
-    assert false;
-    return null;
-  }
-
-  public static MoveType fromTypeDescriptorChar(char descriptor) {
-    switch (descriptor) {
-      case 'L':  // object
-      case '[':  // array
-        return MoveType.OBJECT;
-      case 'Z':  // boolean
-      case 'B':  // byte
-      case 'S':  // short
-      case 'C':  // char
-      case 'I':  // int
-      case 'F':  // float
-        return MoveType.SINGLE;
-      case 'J':  // long
-      case 'D':  // double
-        return MoveType.WIDE;
-      case 'V':
-        throw new InternalCompilerError("No move type for void type.");
-      default:
-        throw new Unreachable("Invalid descriptor char '" + descriptor + "'");
-    }
-  }
-
-  public static MoveType fromDexType(DexType type) {
-    return fromTypeDescriptorChar((char) type.descriptor.content[0]);
-  }
-
-  public static MoveType fromConstType(ConstType type) {
-    switch (type) {
-      case INT:
-      case FLOAT:
-      case INT_OR_FLOAT:
-        return MoveType.SINGLE;
-      case OBJECT:
-        return MoveType.OBJECT;
-      case LONG:
-      case DOUBLE:
-      case LONG_OR_DOUBLE:
-        return MoveType.WIDE;
-      default:
-        throw new Unreachable("Invalid const type '" + type + "'");
-    }
-  }
-
-  public static MoveType fromNumericType(NumericType type) {
-    switch (type) {
-      case BYTE:
-      case CHAR:
-      case SHORT:
-      case INT:
-      case FLOAT:
-        return MoveType.SINGLE;
-      case LONG:
-      case DOUBLE:
-        return MoveType.WIDE;
-      default:
-        throw new Unreachable("Invalid numeric type '" + type + "'");
-    }
-  }
-}
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 dc0be38..9fb215f 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
@@ -29,23 +29,24 @@
   @Override
   public ConstInstruction fold(IRCode code) {
     assert canBeFolded();
+    ValueType valueType = ValueType.fromNumericType(type);
     if (type == NumericType.INT) {
       int result = -source().getConstInstruction().asConstNumber().getIntValue();
-      Value value = code.createValue(MoveType.SINGLE, getLocalInfo());
-      return new ConstNumber(ConstType.INT, value, result);
+      Value value = code.createValue(valueType, getLocalInfo());
+      return new ConstNumber(valueType, value, result);
     } else if (type == NumericType.LONG) {
       long result = -source().getConstInstruction().asConstNumber().getLongValue();
-      Value value = code.createValue(MoveType.WIDE, getLocalInfo());
-      return new ConstNumber(ConstType.LONG, value, result);
+      Value value = code.createValue(valueType, getLocalInfo());
+      return new ConstNumber(valueType, value, result);
     } else if (type == NumericType.FLOAT) {
       float result = -source().getConstInstruction().asConstNumber().getFloatValue();
-      Value value = code.createValue(MoveType.SINGLE, getLocalInfo());
-      return new ConstNumber(ConstType.FLOAT, value, Float.floatToIntBits(result));
+      Value value = code.createValue(valueType, getLocalInfo());
+      return new ConstNumber(valueType, value, Float.floatToIntBits(result));
     } else {
       assert type == NumericType.DOUBLE;
       double result = -source().getConstInstruction().asConstNumber().getDoubleValue();
-      Value value = code.createValue(MoveType.WIDE, getLocalInfo());
-      return new ConstNumber(ConstType.DOUBLE, value, Double.doubleToLongBits(result));
+      Value value = code.createValue(valueType, getLocalInfo());
+      return new ConstNumber(valueType, 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 98e2207..ec941c0 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
@@ -25,15 +25,16 @@
   @Override
   public ConstInstruction fold(IRCode code) {
     assert canBeFolded();
+    ValueType valueType = ValueType.fromNumericType(type);
     if (type == NumericType.INT) {
       int result = ~(source().getConstInstruction().asConstNumber().getIntValue());
-      Value value = code.createValue(MoveType.SINGLE, getLocalInfo());
-      return new ConstNumber(ConstType.INT, value, result);
+      Value value = code.createValue(valueType, getLocalInfo());
+      return new ConstNumber(valueType, value, result);
     } else {
       assert type == NumericType.LONG;
       long result = ~source().getConstInstruction().asConstNumber().getLongValue();
-      Value value = code.createValue(MoveType.WIDE, getLocalInfo());
-      return new ConstNumber(ConstType.LONG, value, result);
+      Value value = code.createValue(valueType, getLocalInfo());
+      return new ConstNumber(valueType, value, result);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/NumericType.java b/src/main/java/com/android/tools/r8/ir/code/NumericType.java
index 765bfe1..a8cdf50 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NumericType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NumericType.java
@@ -16,13 +16,6 @@
   FLOAT,
   DOUBLE;
 
-  public MoveType moveTypeFor() {
-    if (this == NumericType.DOUBLE || this == NumericType.LONG) {
-      return MoveType.WIDE;
-    }
-    return MoveType.SINGLE;
-  }
-
   public DexType dexTypeFor(DexItemFactory factory) {
     switch (this) {
       case BYTE:
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 dc6d500..5a9673f 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
@@ -36,9 +36,9 @@
   // have either of the creation types 'single' and 'object' depending on the use that
   // triggered the creation of the phi. We therefore have to delay the output type
   // computation of the phi until all operands are known.
-  private MoveType outType = null;
+  private ValueType outType = null;
 
-  public Phi(int number, BasicBlock block, MoveType type, DebugLocalInfo local) {
+  public Phi(int number, BasicBlock block, ValueType type, DebugLocalInfo local) {
     super(number, type, local);
     this.block = block;
     block.addPhi(this);
@@ -274,7 +274,7 @@
 
   private boolean isSingleConstZero(Value value) {
     return value.definition != null
-        && value.outType() == MoveType.SINGLE
+        && value.outType().isSingle()
         && value.isZero();
   }
 
@@ -313,7 +313,7 @@
     return true;
   }
 
-  private MoveType computeOutType(Set<Phi> active) {
+  private ValueType computeOutType(Set<Phi> active) {
     if (outType != null) {
       return outType;
     }
@@ -329,23 +329,21 @@
     // We did not find a non-phi operand that dictates the type. Recurse on phi arguments.
     for (Value operand : operands) {
       if (operand.isPhi() && !active.contains(operand.asPhi())) {
-        MoveType phiType = operand.asPhi().computeOutType(active);
-        // TODO(zerny): If we had a CONST_ZERO type element, we could often avoid going through
-        // all phis. We would only have to recurse until we got a non CONST_ZERO out type.
-        if (phiType != MoveType.SINGLE) {
+        ValueType phiType = operand.asPhi().computeOutType(active);
+        if (phiType != ValueType.INT_OR_FLOAT) {
           return phiType;
         }
       }
     }
-    // All operands were the constant zero or phis with out type SINGLE and the out type is either
-    // object or single depending on the use. Since all inputs have out type SINGLE it is safe to
-    // return MoveType.SINGLE here.
-    assert type == MoveType.SINGLE || type == MoveType.OBJECT;
-    return MoveType.SINGLE;
+    // All operands were the constant zero or phis with out type INT_OR_FLOAT and the DEX move type
+    // is either object or single depending on the use. Since all inputs have out type INT_OF_FLOAT
+    // it is safe to return ValueType.INT_OR_FLOAT here.
+    assert type.isSingle() || type.isObject();
+    return ValueType.INT_OR_FLOAT;
   }
 
   @Override
-  public MoveType outType() {
+  public ValueType outType() {
     if (outType != null) {
       return outType;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Return.java b/src/main/java/com/android/tools/r8/ir/code/Return.java
index e16cf95..6561d27 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Return.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Return.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfReturn;
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.code.ReturnObject;
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.code.ReturnWide;
@@ -12,7 +13,6 @@
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.conversion.CfBuilder;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
 import com.android.tools.r8.ir.conversion.CfBuilder.StackHelper;
 import com.android.tools.r8.ir.conversion.DexBuilder;
 import com.android.tools.r8.ir.optimize.Inliner.Constraint;
@@ -20,14 +20,14 @@
 public class Return extends JumpInstruction {
 
   // Need to keep track of the original return type, as a null value will have MoveType.SINGLE.
-  final private MoveType returnType;
+  final private ValueType returnType;
 
   public Return() {
     super(null);
     returnType = null;
   }
 
-  public Return(Value value, MoveType returnType) {
+  public Return(Value value, ValueType returnType) {
     super(null, value);
     this.returnType = returnType;
   }
@@ -36,7 +36,7 @@
     return inValues.size() == 0;
   }
 
-  public MoveType getReturnType() {
+  public ValueType getReturnType() {
     return returnType;
   }
 
@@ -49,19 +49,16 @@
     if (isReturnVoid()) {
       return new ReturnVoid();
     } else {
-      switch (returnValue().type) {
+      switch (MoveType.fromValueType(returnType)) {
         case OBJECT:
-          assert returnType == MoveType.OBJECT;
+          assert returnValue().outType().isObject() || returnValue().outType().isSingle();
           return new ReturnObject(builder.allocatedRegister(returnValue(), getNumber()));
         case SINGLE:
-          if (returnType == MoveType.OBJECT) {
-            return new ReturnObject(builder.allocatedRegister(returnValue(), getNumber()));
-          } else {
-            assert returnType == MoveType.SINGLE;
-            return new com.android.tools.r8.code.Return(builder.allocatedRegister(returnValue(), getNumber()));
-          }
+          assert returnValue().outType().isSingle();
+          return new com.android.tools.r8.code.Return(
+              builder.allocatedRegister(returnValue(), getNumber()));
         case WIDE:
-          assert returnType == MoveType.WIDE;
+          assert returnValue().outType().isWide();
           return new ReturnWide(builder.allocatedRegister(returnValue(), getNumber()));
         default:
           throw new Unreachable();
@@ -120,18 +117,9 @@
 
   @Override
   public void insertLoadAndStores(InstructionListIterator it, StackHelper stack) {
-    if (isReturnVoid()) {
-      return;
+    if (!isReturnVoid()) {
+      stack.loadInValues(this, it);
     }
-    Value oldValue = returnValue();
-    StackValue stackValue = new StackValue(returnType);
-    replaceValue(oldValue, stackValue);
-    Load load =
-        new Load(LocalType.fromDexType(stack.method.proto.returnType), stackValue, oldValue);
-    load.setBlock(getBlock());
-    it.previous();
-    it.add(load);
-    it.next();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/StackValue.java b/src/main/java/com/android/tools/r8/ir/code/StackValue.java
index f743e9e..f670621 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StackValue.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StackValue.java
@@ -5,7 +5,7 @@
 
 public class StackValue extends Value {
 
-  public StackValue(MoveType type) {
+  public StackValue(ValueType type) {
     super(Value.UNDEFINED_NUMBER, type, null);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
index 8338db5..af91d29 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.conversion.CfBuilder;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
 import com.android.tools.r8.ir.conversion.CfBuilder.StackHelper;
 import com.android.tools.r8.ir.conversion.DexBuilder;
 
@@ -119,7 +118,7 @@
 
   @Override
   public void insertLoadAndStores(InstructionListIterator it, StackHelper stack) {
-    stack.storeOutValue(this, LocalType.fromDexType(field.type), it);
+    stack.storeOutValue(this, it);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Store.java b/src/main/java/com/android/tools/r8/ir/code/Store.java
index 2124a40..e5b90a3 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Store.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Store.java
@@ -8,16 +8,12 @@
 import com.android.tools.r8.graph.AppInfoWithSubtyping;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.conversion.CfBuilder;
-import com.android.tools.r8.ir.conversion.CfBuilder.LocalType;
 import com.android.tools.r8.ir.optimize.Inliner.Constraint;
 
 public class Store extends Instruction {
 
-  private final LocalType type;
-
-  public Store(LocalType type, Value dest, StackValue src) {
+  public Store(Value dest, StackValue src) {
     super(dest, src);
-    this.type = type;
   }
 
   @Override
@@ -47,6 +43,6 @@
 
   @Override
   public void buildCf(CfBuilder builder) {
-    builder.add(new CfStore(type, outValue.getNumber()));
+    builder.add(new CfStore(outType(), outValue.getNumber()));
   }
 }
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 4baf23f..b925b8b 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
@@ -70,10 +70,10 @@
 
   public static final int UNDEFINED_NUMBER = -1;
 
-  public static final Value UNDEFINED = new Value(UNDEFINED_NUMBER, MoveType.OBJECT, null);
+  public static final Value UNDEFINED = new Value(UNDEFINED_NUMBER, ValueType.OBJECT, null);
 
   protected final int number;
-  protected final MoveType type;
+  protected final ValueType type;
   public Instruction definition = null;
   private LinkedList<Instruction> users = new LinkedList<>();
   private Set<Instruction> uniqueUsers = null;
@@ -90,7 +90,7 @@
   private LongInterval valueRange;
   private DebugData debugData;
 
-  public Value(int number, MoveType type, DebugLocalInfo local) {
+  public Value(int number, ValueType type, DebugLocalInfo local) {
     this.number = number;
     this.type = type;
     this.debugData = local == null ? null : new DebugData(local);
@@ -463,7 +463,7 @@
       builder.append("(");
       if (isConstant) {
         ConstNumber constNumber = definition.asConstNumber();
-        if (constNumber.outType() == MoveType.SINGLE) {
+        if (constNumber.outType().isSingle()) {
           builder.append((int) constNumber.getRawValue());
         } else {
           builder.append(constNumber.getRawValue());
@@ -483,7 +483,7 @@
     return builder.toString();
   }
 
-  public MoveType outType() {
+  public ValueType outType() {
     return type;
   }
 
@@ -580,11 +580,11 @@
 
   public LongInterval getValueRange() {
     if (isConstNumber()) {
-      if (type == MoveType.SINGLE) {
+      if (type.isSingle()) {
         int value = getConstInstruction().asConstNumber().getIntValue();
         return new LongInterval(value, value);
       } else {
-        assert type == MoveType.WIDE;
+        assert type.isWide();
         long value = getConstInstruction().asConstNumber().getLongValue();
         return new LongInterval(value, value);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ValueType.java b/src/main/java/com/android/tools/r8/ir/code/ValueType.java
new file mode 100644
index 0000000..231a82f
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/code/ValueType.java
@@ -0,0 +1,105 @@
+// Copyright (c) 2016, 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.code;
+
+import com.android.tools.r8.errors.InternalCompilerError;
+import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.DexType;
+
+public enum ValueType {
+  OBJECT,
+  INT,
+  FLOAT,
+  INT_OR_FLOAT,
+  LONG,
+  DOUBLE,
+  LONG_OR_DOUBLE;
+
+  public boolean isObject() {
+    return this == OBJECT;
+  }
+
+  public boolean isSingle() {
+    return this == INT || this == FLOAT || this == INT_OR_FLOAT;
+  }
+
+  public boolean isWide() {
+    return this == LONG || this == DOUBLE || this == LONG_OR_DOUBLE;
+  }
+
+  public int requiredRegisters() {
+    return isWide() ? 2 : 1;
+  }
+
+  public boolean compatible(ValueType other) {
+    return (isObject() && other.isObject())
+        || (isSingle() && other.isSingle())
+        || (isWide() && other.isWide());
+  }
+
+  public static ValueType fromMemberType(MemberType type) {
+    switch (type) {
+      case BOOLEAN:
+      case BYTE:
+      case CHAR:
+      case SHORT:
+        return ValueType.INT;
+      case SINGLE:
+        return ValueType.INT_OR_FLOAT;
+      case WIDE:
+        return ValueType.LONG_OR_DOUBLE;
+      case OBJECT:
+        return ValueType.OBJECT;
+      default:
+        throw new Unreachable("Unexpected member type: " + type);
+    }
+  }
+
+  public static ValueType fromTypeDescriptorChar(char descriptor) {
+    switch (descriptor) {
+      case 'L':
+      case '[':
+        return ValueType.OBJECT;
+      case 'Z':
+      case 'B':
+      case 'S':
+      case 'C':
+      case 'I':
+        return ValueType.INT;
+      case 'F':
+        return ValueType.FLOAT;
+      case 'J':
+        return ValueType.LONG;
+      case 'D':
+        return ValueType.DOUBLE;
+      case 'V':
+        throw new InternalCompilerError("No value type for void type.");
+      default:
+        throw new Unreachable("Invalid descriptor char '" + descriptor + "'");
+    }
+  }
+
+  public static ValueType fromDexType(DexType type) {
+    return fromTypeDescriptorChar((char) type.descriptor.content[0]);
+  }
+
+  public static ValueType fromNumericType(NumericType type) {
+    switch (type) {
+      case BYTE:
+      case CHAR:
+      case SHORT:
+      case INT:
+        return ValueType.INT;
+      case FLOAT:
+        return ValueType.FLOAT;
+      case LONG:
+        return ValueType.LONG;
+      case DOUBLE:
+        return ValueType.DOUBLE;
+      default:
+        throw new Unreachable("Invalid numeric type '" + type + "'");
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
index f50747b..15b0f69 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
@@ -5,21 +5,17 @@
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.errors.Unimplemented;
-import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.Argument;
 import com.android.tools.r8.ir.code.BasicBlock;
-import com.android.tools.r8.ir.code.ConstType;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionIterator;
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.Load;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Pop;
 import com.android.tools.r8.ir.code.StackValue;
 import com.android.tools.r8.ir.code.Store;
@@ -29,57 +25,6 @@
 
 public class CfBuilder {
 
-  public enum LocalType {
-    REFERENCE,
-    INTEGER,
-    FLOAT,
-    LONG,
-    DOUBLE;
-
-    public static LocalType fromDexType(DexType type) {
-      switch (type.toShorty()) {
-        case 'Z':
-        case 'B':
-        case 'C':
-        case 'S':
-        case 'I':
-          return INTEGER;
-        case 'F':
-          return FLOAT;
-        case 'J':
-          return LONG;
-        case 'D':
-          return DOUBLE;
-        case 'L':
-          return REFERENCE;
-        default:
-          throw new Unreachable("Unexpected type " + type);
-      }
-    }
-
-    public static LocalType fromConstType(ConstType type) {
-      switch (type) {
-        case INT:
-          return INTEGER;
-        case DOUBLE:
-          return DOUBLE;
-        case FLOAT:
-          return FLOAT;
-        case OBJECT:
-          return REFERENCE;
-        case LONG:
-          return LONG;
-        case INT_OR_FLOAT:
-        case LONG_OR_DOUBLE:
-          throw new Unreachable("Const combination types not supported in cf backend");
-        default:
-          throw new Unreachable("Unexpected type " + type);
-      }
-    }
-
-  }
-
-
   private final DexEncodedMethod method;
   private final IRCode code;
   private List<CfInstruction> instructions;
@@ -92,31 +37,25 @@
       this.method = method;
     }
 
-    public void loadInValues(
-        Instruction instruction,
-        List<Value> values,
-        List<LocalType> types,
-        InstructionListIterator it) {
-      assert values.size() == types.size();
+    public void loadInValues(Instruction instruction, InstructionListIterator it) {
       it.previous();
-      for (int i = 0; i < values.size(); i++) {
-        Value value = values.get(i);
-        LocalType type = types.get(i);
+      for (int i = 0; i < instruction.inValues().size(); i++) {
+        Value value = instruction.inValues().get(i);
         StackValue stackValue = new StackValue(value.outType());
         instruction.replaceValue(value, stackValue);
-        add(new Load(type, stackValue, value), instruction, it);
+        add(new Load(stackValue, value), instruction, it);
       }
       it.next();
     }
 
-    public void storeOutValue(Instruction instruction, LocalType type, InstructionListIterator it) {
+    public void storeOutValue(Instruction instruction, InstructionListIterator it) {
       StackValue newOutValue = new StackValue(instruction.outType());
       Value oldOutValue = instruction.swapOutValue(newOutValue);
-      add(new Store(type, oldOutValue, newOutValue), instruction, it);
+      add(new Store(oldOutValue, newOutValue), instruction, it);
     }
 
-    public void popOutValue(Instruction instruction, MoveType type, InstructionListIterator it) {
-      StackValue newOutValue = new StackValue(type);
+    public void popOutValue(Instruction instruction, InstructionListIterator it) {
+      StackValue newOutValue = new StackValue(instruction.outType());
       instruction.swapOutValue(newOutValue);
       add(new Pop(newOutValue), instruction, it);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
index 2335f2b..43a91f3 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -27,6 +27,7 @@
 import com.android.tools.r8.code.MoveObject;
 import com.android.tools.r8.code.MoveObject16;
 import com.android.tools.r8.code.MoveObjectFrom16;
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.code.MoveWide;
 import com.android.tools.r8.code.MoveWide16;
 import com.android.tools.r8.code.MoveWideFrom16;
@@ -1168,6 +1169,7 @@
     @Override
     public void addInstructions(DexBuilder builder, List<Instruction> instructions) {
       Move move = getMove();
+      MoveType moveType = MoveType.fromValueType(move.outType());
       int dest = builder.allocatedRegister(move.dest(), move.getNumber());
       int src = builder.allocatedRegister(move.src(), move.getNumber());
       Instruction instruction = null;
@@ -1177,7 +1179,7 @@
             instruction = new Nop();
             break;
           }
-          switch (move.outType()) {
+          switch (moveType) {
             case SINGLE:
               instruction = new com.android.tools.r8.code.Move(dest, src);
               break;
@@ -1192,7 +1194,7 @@
           }
           break;
         case 2:
-          switch (move.outType()) {
+          switch (moveType) {
             case SINGLE:
               instruction = new MoveFrom16(dest, src);
               break;
@@ -1207,7 +1209,7 @@
           }
           break;
         case 3:
-          switch (move.outType()) {
+          switch (moveType) {
             case SINGLE:
               instruction = new Move16(dest, src);
               break;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
index 4bafe62..e353a70 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -41,8 +41,8 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.ir.code.CatchHandlers;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Position;
+import com.android.tools.r8.ir.code.ValueType;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -70,7 +70,7 @@
   private Position currentPosition = null;
   private Map<Position, Position> canonicalPositions = null;
 
-  private final List<MoveType> argumentTypes;
+  private final List<ValueType> argumentTypes;
 
   private List<DexDebugEntry> debugEntries = null;
 
@@ -131,7 +131,7 @@
       builder.addThisArgument(register);
       ++register;
     }
-    for (MoveType type : argumentTypes) {
+    for (ValueType type : argumentTypes) {
       builder.addNonThisArgument(register, type);
       register += type.requiredRegisters();
     }
@@ -260,12 +260,12 @@
         arrayFilledDataPayloadResolver.getData(payloadOffset));
   }
 
-  private List<MoveType> computeArgumentTypes() {
-    List<MoveType> types = new ArrayList<>(proto.parameters.size());
+  private List<ValueType> computeArgumentTypes() {
+    List<ValueType> types = new ArrayList<>(proto.parameters.size());
     String shorty = proto.shorty.toString();
     for (int i = 1; i < proto.shorty.size; i++) {
-      MoveType moveType = MoveType.fromTypeDescriptorChar(shorty.charAt(i));
-      types.add(moveType);
+      ValueType valueType = ValueType.fromTypeDescriptorChar(shorty.charAt(i));
+      types.add(valueType);
     }
     return types;
   }
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 4a96ae6..68c3f08 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
@@ -36,7 +36,6 @@
 import com.android.tools.r8.ir.code.ConstMethodType;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.ConstString;
-import com.android.tools.r8.ir.code.ConstType;
 import com.android.tools.r8.ir.code.DebugLocalRead;
 import com.android.tools.r8.ir.code.DebugLocalUninitialized;
 import com.android.tools.r8.ir.code.DebugLocalWrite;
@@ -56,7 +55,6 @@
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.code.Monitor;
 import com.android.tools.r8.ir.code.MoveException;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Mul;
 import com.android.tools.r8.ir.code.Neg;
 import com.android.tools.r8.ir.code.NewArrayEmpty;
@@ -80,6 +78,7 @@
 import com.android.tools.r8.ir.code.Ushr;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.code.ValueNumberGenerator;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.code.Xor;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.InternalOptions;
@@ -529,7 +528,7 @@
     int moveExceptionDest = source.getMoveExceptionRegister();
     assert moveExceptionDest >= 0;
     int targetIndex = source.instructionIndex(moveExceptionItem.targetOffset);
-    Value out = writeRegister(moveExceptionDest, MoveType.OBJECT, ThrowingInfo.NO_THROW, null);
+    Value out = writeRegister(moveExceptionDest, ValueType.OBJECT, ThrowingInfo.NO_THROW, null);
     Position position = source.getDebugPositionAtOffset(moveExceptionItem.targetOffset);
     MoveException moveException = new MoveException(out);
     moveException.setPosition(position);
@@ -564,35 +563,34 @@
 
   public void addThisArgument(int register) {
     DebugLocalInfo local = getCurrentLocal(register);
-    Value value = writeRegister(register, MoveType.OBJECT, ThrowingInfo.NO_THROW, local);
+    Value value = writeRegister(register, ValueType.OBJECT, ThrowingInfo.NO_THROW, local);
     addInstruction(new Argument(value));
     value.markAsThis();
   }
 
-  public void addNonThisArgument(int register, MoveType moveType) {
+  public void addNonThisArgument(int register, ValueType valueType) {
     DebugLocalInfo local = getCurrentLocal(register);
-    Value value = writeRegister(register, moveType, ThrowingInfo.NO_THROW, local);
+    Value value = writeRegister(register, valueType, ThrowingInfo.NO_THROW, local);
     addInstruction(new Argument(value));
   }
 
   public void addBooleanNonThisArgument(int register) {
     DebugLocalInfo local = getCurrentLocal(register);
-    Value value = writeRegister(register, MoveType.SINGLE, ThrowingInfo.NO_THROW, local);
+    Value value = writeRegister(register, ValueType.INT, ThrowingInfo.NO_THROW, local);
     value.setKnownToBeBoolean(true);
     addInstruction(new Argument(value));
   }
 
-  public void addDebugUninitialized(int register, ConstType type) {
+  public void addDebugUninitialized(int register, ValueType type) {
     if (!options.debug) {
       return;
     }
-    Value value = writeRegister(register, MoveType.fromConstType(type), ThrowingInfo.NO_THROW,
-        null);
+    Value value = writeRegister(register, type, ThrowingInfo.NO_THROW, null);
     assert !value.hasLocalInfo();
     addInstruction(new DebugLocalUninitialized(type, value));
   }
 
-  private void addDebugLocalWrite(MoveType type, int dest, Value in) {
+  private void addDebugLocalWrite(ValueType type, int dest, Value in) {
     assert options.debug;
     Value out = writeRegister(dest, type, ThrowingInfo.NO_THROW);
     DebugLocalWrite write = new DebugLocalWrite(out, in);
@@ -604,8 +602,8 @@
     assert options.debug;
     assert local != null;
     assert local == getCurrentLocal(register);
-    MoveType moveType = MoveType.fromDexType(local.type);
-    return readRegisterIgnoreLocal(register, moveType);
+    ValueType valueType = ValueType.fromDexType(local.type);
+    return readRegisterIgnoreLocal(register, valueType);
   }
 
   private static boolean isValidFor(Value value, DebugLocalInfo local) {
@@ -633,7 +631,7 @@
     // If the value is for a different local, introduce the new local. We cannot shortcut if the
     // local is defined by a phi as it could end up being trivial.
     if (value.isPhi() || value.getLocalInfo() != local) {
-      addDebugLocalWrite(MoveType.fromDexType(local.type), register, value);
+      addDebugLocalWrite(ValueType.fromDexType(local.type), register, value);
       return;
     }
 
@@ -735,9 +733,9 @@
   }
 
   public void addArrayGet(MemberType type, int dest, int array, int index) {
-    Value in1 = readRegister(array, MoveType.OBJECT);
-    Value in2 = readRegister(index, MoveType.SINGLE);
-    Value out = writeRegister(dest, MoveType.fromMemberType(type), ThrowingInfo.CAN_THROW);
+    Value in1 = readRegister(array, ValueType.OBJECT);
+    Value in2 = readRegister(index, ValueType.INT);
+    Value out = writeRegister(dest, ValueType.fromMemberType(type), ThrowingInfo.CAN_THROW);
     out.setKnownToBeBoolean(type == MemberType.BOOLEAN);
     ArrayGet instruction = new ArrayGet(type, out, in1, in2);
     assert instruction.instructionTypeCanThrow();
@@ -745,8 +743,8 @@
   }
 
   public void addArrayLength(int dest, int array) {
-    Value in = readRegister(array, MoveType.OBJECT);
-    Value out = writeRegister(dest, MoveType.SINGLE, ThrowingInfo.CAN_THROW);
+    Value in = readRegister(array, ValueType.OBJECT);
+    Value out = writeRegister(dest, ValueType.INT, ThrowingInfo.CAN_THROW);
     ArrayLength instruction = new ArrayLength(out, in);
     assert instruction.instructionTypeCanThrow();
     add(instruction);
@@ -754,16 +752,16 @@
 
   public void addArrayPut(MemberType type, int value, int array, int index) {
     List<Value> ins = new ArrayList<>(3);
-    ins.add(readRegister(value, MoveType.fromMemberType(type)));
-    ins.add(readRegister(array, MoveType.OBJECT));
-    ins.add(readRegister(index, MoveType.SINGLE));
+    ins.add(readRegister(value, ValueType.fromMemberType(type)));
+    ins.add(readRegister(array, ValueType.OBJECT));
+    ins.add(readRegister(index, ValueType.INT));
     ArrayPut instruction = new ArrayPut(type, ins);
     add(instruction);
   }
 
   public void addCheckCast(int value, DexType type) {
-    Value in = readRegister(value, MoveType.OBJECT);
-    Value out = writeRegister(value, MoveType.OBJECT, ThrowingInfo.CAN_THROW);
+    Value in = readRegister(value, ValueType.OBJECT);
+    Value out = writeRegister(value, ValueType.OBJECT, ThrowingInfo.CAN_THROW);
     CheckCast instruction = new CheckCast(out, in, type);
     assert instruction.instructionTypeCanThrow();
     add(instruction);
@@ -772,22 +770,15 @@
   public void addCmp(NumericType type, Bias bias, int dest, int left, int right) {
     Value in1 = readNumericRegister(left, type);
     Value in2 = readNumericRegister(right, type);
-    Value out = writeRegister(dest, MoveType.SINGLE, ThrowingInfo.NO_THROW);
+    Value out = writeRegister(dest, ValueType.INT, ThrowingInfo.NO_THROW);
     Cmp instruction = new Cmp(type, bias, out, in1, in2);
     assert !instruction.instructionTypeCanThrow();
     add(instruction);
   }
 
-  public void addConst(MoveType type, int dest, long value) {
-    ConstNumber instruction;
-    if (type == MoveType.SINGLE) {
-      Value out = writeRegister(dest, type, ThrowingInfo.NO_THROW);
-      instruction = new ConstNumber(ConstType.INT_OR_FLOAT, out, value);
-    } else {
-      assert type == MoveType.WIDE;
-      Value out = writeRegister(dest, type, ThrowingInfo.NO_THROW);
-      instruction = new ConstNumber(ConstType.LONG_OR_DOUBLE, out, value);
-    }
+  public void addConst(ValueType type, int dest, long value) {
+    Value out = writeRegister(dest, type, ThrowingInfo.NO_THROW);
+    ConstNumber instruction = new ConstNumber(type, out, value);
     assert !instruction.instructionTypeCanThrow();
     add(instruction);
   }
@@ -796,12 +787,12 @@
   // to disable constant canonicalization in debug builds to make sure we have separate values
   // for separate locals.
   private void canonicalizeAndAddConst(
-      ConstType type, int dest, long value, Long2ObjectMap<ConstNumber> table) {
+      ValueType type, int dest, long value, Long2ObjectMap<ConstNumber> table) {
     ConstNumber existing = table.get(value);
     if (existing != null) {
       currentBlock.writeCurrentDefinition(dest, existing.outValue(), ThrowingInfo.NO_THROW);
     } else {
-      Value out = writeRegister(dest, MoveType.fromConstType(type), ThrowingInfo.NO_THROW);
+      Value out = writeRegister(dest, type, ThrowingInfo.NO_THROW);
       ConstNumber instruction = new ConstNumber(type, out, value);
       BasicBlock entryBlock = blocks.get(0);
       if (currentBlock != entryBlock) {
@@ -825,27 +816,27 @@
   }
 
   public void addLongConst(int dest, long value) {
-    canonicalizeAndAddConst(ConstType.LONG, dest, value, longConstants);
+    canonicalizeAndAddConst(ValueType.LONG, dest, value, longConstants);
   }
 
   public void addDoubleConst(int dest, long value) {
-    canonicalizeAndAddConst(ConstType.DOUBLE, dest, value, doubleConstants);
+    canonicalizeAndAddConst(ValueType.DOUBLE, dest, value, doubleConstants);
   }
 
   public void addIntConst(int dest, long value) {
-    canonicalizeAndAddConst(ConstType.INT, dest, value, intConstants);
+    canonicalizeAndAddConst(ValueType.INT, dest, value, intConstants);
   }
 
   public void addFloatConst(int dest, long value) {
-    canonicalizeAndAddConst(ConstType.FLOAT, dest, value, floatConstants);
+    canonicalizeAndAddConst(ValueType.FLOAT, dest, value, floatConstants);
   }
 
   public void addNullConst(int dest, long value) {
-    canonicalizeAndAddConst(ConstType.OBJECT, dest, value, nullConstants);
+    canonicalizeAndAddConst(ValueType.OBJECT, dest, value, nullConstants);
   }
 
   public void addConstClass(int dest, DexType type) {
-    Value out = writeRegister(dest, MoveType.OBJECT, ThrowingInfo.CAN_THROW);
+    Value out = writeRegister(dest, ValueType.OBJECT, ThrowingInfo.CAN_THROW);
     ConstClass instruction = new ConstClass(out, type);
     assert instruction.instructionTypeCanThrow();
     add(instruction);
@@ -859,7 +850,7 @@
           "Const-method-handle",
           null /* sourceString */);
     }
-    Value out = writeRegister(dest, MoveType.OBJECT, ThrowingInfo.CAN_THROW);
+    Value out = writeRegister(dest, ValueType.OBJECT, ThrowingInfo.CAN_THROW);
     ConstMethodHandle instruction = new ConstMethodHandle(out, methodHandle);
     add(instruction);
   }
@@ -872,13 +863,13 @@
           "Const-method-type",
           null /* sourceString */);
     }
-    Value out = writeRegister(dest, MoveType.OBJECT, ThrowingInfo.CAN_THROW);
+    Value out = writeRegister(dest, ValueType.OBJECT, ThrowingInfo.CAN_THROW);
     ConstMethodType instruction = new ConstMethodType(out, methodType);
     add(instruction);
   }
 
   public void addConstString(int dest, DexString string) {
-    Value out = writeRegister(dest, MoveType.OBJECT, ThrowingInfo.CAN_THROW);
+    Value out = writeRegister(dest, ValueType.OBJECT, ThrowingInfo.CAN_THROW);
     ConstString instruction = new ConstString(out, string);
     add(instruction);
   }
@@ -907,13 +898,13 @@
   }
 
   public Monitor addMonitor(Monitor.Type type, int monitor) {
-    Value in = readRegister(monitor, MoveType.OBJECT);
+    Value in = readRegister(monitor, ValueType.OBJECT);
     Monitor monitorEnter = new Monitor(type, in);
     add(monitorEnter);
     return monitorEnter;
   }
 
-  public void addMove(MoveType type, int dest, int src) {
+  public void addMove(ValueType type, int dest, int src) {
     Value in = readRegister(src, type);
     if (options.debug) {
       // If the move is writing to a different local we must construct a new value.
@@ -1013,8 +1004,8 @@
       addTrivialIf(trueTargetOffset, falseTargetOffset);
     } else {
       List<Value> values = new ArrayList<>(2);
-      values.add(readRegister(value1, MoveType.SINGLE));
-      values.add(readRegister(value2, MoveType.SINGLE));
+      values.add(readRegister(value1, ValueType.INT));
+      values.add(readRegister(value2, ValueType.INT));
       If instruction = new If(type, values);
       addNonTrivialIf(instruction, trueTargetOffset, falseTargetOffset);
     }
@@ -1024,7 +1015,7 @@
     if (trueTargetOffset == falseTargetOffset) {
       addTrivialIf(trueTargetOffset, falseTargetOffset);
     } else {
-      If instruction = new If(type, readRegister(value, MoveType.SINGLE));
+      If instruction = new If(type, readRegister(value, ValueType.INT));
       addNonTrivialIf(instruction, trueTargetOffset, falseTargetOffset);
     }
   }
@@ -1034,8 +1025,8 @@
       int dest,
       int object,
       DexField field) {
-    Value in = readRegister(object, MoveType.OBJECT);
-    Value out = writeRegister(dest, MoveType.fromMemberType(type), ThrowingInfo.CAN_THROW);
+    Value in = readRegister(object, ValueType.OBJECT);
+    Value out = writeRegister(dest, ValueType.fromMemberType(type), ThrowingInfo.CAN_THROW);
     out.setKnownToBeBoolean(type == MemberType.BOOLEAN);
     InstanceGet instruction = new InstanceGet(type, out, in, field);
     assert instruction.instructionTypeCanThrow();
@@ -1043,8 +1034,8 @@
   }
 
   public void addInstanceOf(int dest, int value, DexType type) {
-    Value in = readRegister(value, MoveType.OBJECT);
-    Value out = writeRegister(dest, MoveType.SINGLE, ThrowingInfo.CAN_THROW);
+    Value in = readRegister(value, ValueType.OBJECT);
+    Value out = writeRegister(dest, ValueType.INT, ThrowingInfo.CAN_THROW);
     InstanceOf instruction = new InstanceOf(out, in, type);
     assert instruction.instructionTypeCanThrow();
     addInstruction(instruction);
@@ -1056,8 +1047,8 @@
       int object,
       DexField field) {
     List<Value> values = new ArrayList<>(2);
-    values.add(readRegister(value, MoveType.fromMemberType(type)));
-    values.add(readRegister(object, MoveType.OBJECT));
+    values.add(readRegister(value, ValueType.fromMemberType(type)));
+    values.add(readRegister(object, ValueType.OBJECT));
     InstancePut instruction = new InstancePut(type, values, field);
     add(instruction);
   }
@@ -1086,7 +1077,7 @@
       Invoke.Type type,
       DexItem item,
       DexProto callSiteProto,
-      List<MoveType> types,
+      List<ValueType> types,
       List<Integer> registers)
       throws ApiLevelException {
     assert types.size() == registers.size();
@@ -1104,16 +1095,16 @@
     List<Value> arguments = new ArrayList<>(argumentRegisterCount);
 
     if (!bootstrapMethod.isStaticHandle()) {
-      arguments.add(readRegister(argumentRegisters[registerIndex], MoveType.OBJECT));
-      registerIndex += MoveType.OBJECT.requiredRegisters();
+      arguments.add(readRegister(argumentRegisters[registerIndex], ValueType.OBJECT));
+      registerIndex += ValueType.OBJECT.requiredRegisters();
     }
 
     String shorty = callSite.methodProto.shorty.toString();
 
     for (int i = 1; i < shorty.length(); i++) {
-      MoveType moveType = MoveType.fromTypeDescriptorChar(shorty.charAt(i));
-      arguments.add(readRegister(argumentRegisters[registerIndex], moveType));
-      registerIndex += moveType.requiredRegisters();
+      ValueType valueType = ValueType.fromTypeDescriptorChar(shorty.charAt(i));
+      arguments.add(readRegister(argumentRegisters[registerIndex], valueType));
+      registerIndex += valueType.requiredRegisters();
     }
 
     add(new InvokeCustom(callSite, null, arguments));
@@ -1126,23 +1117,23 @@
 
     int register = firstArgumentRegister;
     if (!bootstrapMethod.isStaticHandle()) {
-      arguments.add(readRegister(register, MoveType.OBJECT));
-      register += MoveType.OBJECT.requiredRegisters();
+      arguments.add(readRegister(register, ValueType.OBJECT));
+      register += ValueType.OBJECT.requiredRegisters();
     }
 
     String shorty = callSite.methodProto.shorty.toString();
 
     for (int i = 1; i < shorty.length(); i++) {
-      MoveType moveType = MoveType.fromTypeDescriptorChar(shorty.charAt(i));
-      arguments.add(readRegister(register, moveType));
-      register += moveType.requiredRegisters();
+      ValueType valueType = ValueType.fromTypeDescriptorChar(shorty.charAt(i));
+      arguments.add(readRegister(register, valueType));
+      register += valueType.requiredRegisters();
     }
     checkInvokeArgumentRegisters(register, firstArgumentRegister + argumentCount);
     add(new InvokeCustom(callSite, null, arguments));
   }
 
   public void addInvokeCustom(
-      DexCallSite callSite, List<MoveType> types, List<Integer> registers) {
+      DexCallSite callSite, List<ValueType> types, List<Integer> registers) {
     assert types.size() == registers.size();
     List<Value> arguments = new ArrayList<>(types.size());
     for (int i = 0; i < types.size(); i++) {
@@ -1163,8 +1154,8 @@
     List<Value> arguments = new ArrayList<>(argumentRegisterCount);
     int registerIndex = 0;
     if (type != Invoke.Type.STATIC) {
-      arguments.add(readRegister(argumentRegisters[registerIndex], MoveType.OBJECT));
-      registerIndex += MoveType.OBJECT.requiredRegisters();
+      arguments.add(readRegister(argumentRegisters[registerIndex], ValueType.OBJECT));
+      registerIndex += ValueType.OBJECT.requiredRegisters();
     }
     DexString methodShorty;
     if (type == Invoke.Type.POLYMORPHIC) {
@@ -1176,9 +1167,9 @@
     }
     String shorty = methodShorty.toString();
     for (int i = 1; i < methodShorty.size; i++) {
-      MoveType moveType = MoveType.fromTypeDescriptorChar(shorty.charAt(i));
-      arguments.add(readRegister(argumentRegisters[registerIndex], moveType));
-      registerIndex += moveType.requiredRegisters();
+      ValueType valueType = ValueType.fromTypeDescriptorChar(shorty.charAt(i));
+      arguments.add(readRegister(argumentRegisters[registerIndex], valueType));
+      registerIndex += valueType.requiredRegisters();
     }
     checkInvokeArgumentRegisters(registerIndex, argumentRegisterCount);
     addInvoke(type, method, callSiteProto, arguments);
@@ -1189,16 +1180,16 @@
     String descriptor = type.descriptor.toString();
     assert descriptor.charAt(0) == '[';
     assert descriptor.length() >= 2;
-    MoveType moveType = MoveType.fromTypeDescriptorChar(descriptor.charAt(1));
-    List<Value> arguments = new ArrayList<>(argumentCount / moveType.requiredRegisters());
+    ValueType valueType = ValueType.fromTypeDescriptorChar(descriptor.charAt(1));
+    List<Value> arguments = new ArrayList<>(argumentCount / valueType.requiredRegisters());
     int registerIndex = 0;
     while (registerIndex < argumentCount) {
-      arguments.add(readRegister(argumentRegisters[registerIndex], moveType));
-      if (moveType == MoveType.WIDE) {
+      arguments.add(readRegister(argumentRegisters[registerIndex], valueType));
+      if (valueType.isWide()) {
         assert registerIndex < argumentCount - 1;
         assert argumentRegisters[registerIndex] == argumentRegisters[registerIndex + 1] + 1;
       }
-      registerIndex += moveType.requiredRegisters();
+      registerIndex += valueType.requiredRegisters();
     }
     checkInvokeArgumentRegisters(registerIndex, argumentCount);
     addInvoke(Invoke.Type.NEW_ARRAY, type, null, arguments);
@@ -1216,8 +1207,8 @@
     List<Value> arguments = new ArrayList<>(argumentCount);
     int register = firstArgumentRegister;
     if (type != Invoke.Type.STATIC) {
-      arguments.add(readRegister(register, MoveType.OBJECT));
-      register += MoveType.OBJECT.requiredRegisters();
+      arguments.add(readRegister(register, ValueType.OBJECT));
+      register += ValueType.OBJECT.requiredRegisters();
     }
     DexString methodShorty;
     if (type == Invoke.Type.POLYMORPHIC) {
@@ -1229,9 +1220,9 @@
     }
     String shorty = methodShorty.toString();
     for (int i = 1; i < methodShorty.size; i++) {
-      MoveType moveType = MoveType.fromTypeDescriptorChar(shorty.charAt(i));
-      arguments.add(readRegister(register, moveType));
-      register += moveType.requiredRegisters();
+      ValueType valueType = ValueType.fromTypeDescriptorChar(shorty.charAt(i));
+      arguments.add(readRegister(register, valueType));
+      register += valueType.requiredRegisters();
     }
     checkInvokeArgumentRegisters(register, firstArgumentRegister + argumentCount);
     addInvoke(type, method, callSiteProto, arguments);
@@ -1242,12 +1233,12 @@
     String descriptor = type.descriptor.toString();
     assert descriptor.charAt(0) == '[';
     assert descriptor.length() >= 2;
-    MoveType moveType = MoveType.fromTypeDescriptorChar(descriptor.charAt(1));
-    List<Value> arguments = new ArrayList<>(argumentCount / moveType.requiredRegisters());
+    ValueType valueType = ValueType.fromTypeDescriptorChar(descriptor.charAt(1));
+    List<Value> arguments = new ArrayList<>(argumentCount / valueType.requiredRegisters());
     int register = firstArgumentRegister;
     while (register < firstArgumentRegister + argumentCount) {
-      arguments.add(readRegister(register, moveType));
-      register += moveType.requiredRegisters();
+      arguments.add(readRegister(register, valueType));
+      register += valueType.requiredRegisters();
     }
     checkInvokeArgumentRegisters(register, firstArgumentRegister + argumentCount);
     addInvoke(Invoke.Type.NEW_ARRAY, type, null, arguments);
@@ -1262,7 +1253,7 @@
   }
 
   public void addMoveException(int dest) {
-    Value out = writeRegister(dest, MoveType.OBJECT, ThrowingInfo.NO_THROW);
+    Value out = writeRegister(dest, ValueType.OBJECT, ThrowingInfo.NO_THROW);
     assert !out.hasLocalInfo();
     MoveException instruction = new MoveException(out);
     assert !instruction.instructionTypeCanThrow();
@@ -1283,7 +1274,7 @@
     addInstruction(instruction);
   }
 
-  public void addMoveResult(MoveType type, int dest) {
+  public void addMoveResult(ValueType type, int dest) {
     List<Instruction> instructions = currentBlock.getInstructions();
     Invoke invoke = instructions.get(instructions.size() - 1).asInvoke();
     assert invoke.outValue() == null;
@@ -1291,7 +1282,7 @@
     invoke.setOutValue(writeRegister(dest, type, ThrowingInfo.CAN_THROW));
   }
 
-  public void addBooleanMoveResult(MoveType type, int dest) {
+  public void addBooleanMoveResult(ValueType type, int dest) {
     List<Instruction> instructions = currentBlock.getInstructions();
     Invoke invoke = instructions.get(instructions.size() - 1).asInvoke();
     assert invoke.outValue() == null;
@@ -1319,25 +1310,25 @@
 
   public void addNewArrayEmpty(int dest, int size, DexType type) {
     assert type.isArrayType();
-    Value in = readRegister(size, MoveType.SINGLE);
-    Value out = writeRegister(dest, MoveType.OBJECT, ThrowingInfo.CAN_THROW);
+    Value in = readRegister(size, ValueType.INT);
+    Value out = writeRegister(dest, ValueType.OBJECT, ThrowingInfo.CAN_THROW);
     NewArrayEmpty instruction = new NewArrayEmpty(out, in, type);
     assert instruction.instructionTypeCanThrow();
     addInstruction(instruction);
   }
 
   public void addNewArrayFilledData(int arrayRef, int elementWidth, long size, short[] data) {
-    add(new NewArrayFilledData(readRegister(arrayRef, MoveType.OBJECT), elementWidth, size, data));
+    add(new NewArrayFilledData(readRegister(arrayRef, ValueType.OBJECT), elementWidth, size, data));
   }
 
   public void addNewInstance(int dest, DexType type) {
-    Value out = writeRegister(dest, MoveType.OBJECT, ThrowingInfo.CAN_THROW);
+    Value out = writeRegister(dest, ValueType.OBJECT, ThrowingInfo.CAN_THROW);
     NewInstance instruction = new NewInstance(type, out);
     assert instruction.instructionTypeCanThrow();
     addInstruction(instruction);
   }
 
-  public void addReturn(MoveType type, int value) {
+  public void addReturn(ValueType type, int value) {
     Value in = readRegister(value, type);
     addReturn(new Return(in, type));
   }
@@ -1355,7 +1346,7 @@
   }
 
   public void addStaticGet(MemberType type, int dest, DexField field) {
-    Value out = writeRegister(dest, MoveType.fromMemberType(type), ThrowingInfo.CAN_THROW);
+    Value out = writeRegister(dest, ValueType.fromMemberType(type), ThrowingInfo.CAN_THROW);
     out.setKnownToBeBoolean(type == MemberType.BOOLEAN);
     StaticGet instruction = new StaticGet(type, out, field);
     assert instruction.instructionTypeCanThrow();
@@ -1363,7 +1354,7 @@
   }
 
   public void addStaticPut(MemberType type, int value, DexField field) {
-    Value in = readRegister(value, MoveType.fromMemberType(type));
+    Value in = readRegister(value, ValueType.fromMemberType(type));
     add(new StaticPut(type, in, field));
   }
 
@@ -1388,22 +1379,6 @@
     addInstruction(instruction);
   }
 
-  private void addSwitchIf(int key, int value, int caseOffset, int fallthroughOffset) {
-    if (key == 0) {
-      addIfZero(If.Type.EQ, value, caseOffset, fallthroughOffset);
-    } else {
-      if (caseOffset == fallthroughOffset) {
-        addTrivialIf(caseOffset, fallthroughOffset);
-      } else {
-        List<Value> values = new ArrayList<>(2);
-        values.add(readRegister(value, MoveType.SINGLE));
-        values.add(readLiteral(NumericType.INT, key));
-        If instruction = new If(If.Type.EQ, values);
-        addNonTrivialIf(instruction, caseOffset, fallthroughOffset);
-      }
-    }
-  }
-
   public void addSwitch(int value, int[] keys, int fallthroughOffset, int[] labelOffsets) {
     int numberOfTargets = labelOffsets.length;
     assert (keys.length == 1) || (keys.length == numberOfTargets);
@@ -1414,7 +1389,7 @@
       return;
     }
 
-    Value switchValue = readRegister(value, MoveType.SINGLE);
+    Value switchValue = readRegister(value, ValueType.INT);
 
     // Find the keys not targeting the fallthrough.
     IntList nonFallthroughKeys = new IntArrayList(numberOfTargets);
@@ -1494,7 +1469,7 @@
   }
 
   public void addThrow(int value) {
-    Value in = readRegister(value, MoveType.OBJECT);
+    Value in = readRegister(value, ValueType.OBJECT);
     addInstruction(new Throw(in));
     closeCurrentBlock();
   }
@@ -1522,7 +1497,7 @@
   public void addShl(NumericType type, int dest, int left, int right) {
     assert isIntegerType(type);
     Value in1 = readNumericRegister(left, type);
-    Value in2 = readRegister(right, MoveType.SINGLE);
+    Value in2 = readRegister(right, ValueType.INT);
     Value out = writeNumericRegister(dest, type, ThrowingInfo.NO_THROW);
     Shl instruction = new Shl(type, out, in1, in2);
     assert !instruction.instructionTypeCanThrow();
@@ -1542,7 +1517,7 @@
   public void addShr(NumericType type, int dest, int left, int right) {
     assert isIntegerType(type);
     Value in1 = readNumericRegister(left, type);
-    Value in2 = readRegister(right, MoveType.SINGLE);
+    Value in2 = readRegister(right, ValueType.INT);
     Value out = writeNumericRegister(dest, type, ThrowingInfo.NO_THROW);
     Shr instruction = new Shr(type, out, in1, in2);
     assert !instruction.instructionTypeCanThrow();
@@ -1562,7 +1537,7 @@
   public void addUshr(NumericType type, int dest, int left, int right) {
     assert isIntegerType(type);
     Value in1 = readNumericRegister(left, type);
-    Value in2 = readRegister(right, MoveType.SINGLE);
+    Value in2 = readRegister(right, ValueType.INT);
     Value out = writeNumericRegister(dest, type, ThrowingInfo.NO_THROW);
     Ushr instruction = new Ushr(type, out, in1, in2);
     assert !instruction.instructionTypeCanThrow();
@@ -1621,7 +1596,7 @@
 
   // Value abstraction methods.
 
-  public Value readRegister(int register, MoveType type) {
+  public Value readRegister(int register, ValueType type) {
     DebugLocalInfo local = getCurrentLocal(register);
     Value value = readRegister(register, type, currentBlock, EdgeType.NON_EDGE, local);
     // Check that any information about a current-local is consistent with the read.
@@ -1640,12 +1615,12 @@
     return value;
   }
 
-  public Value readRegisterIgnoreLocal(int register, MoveType type) {
+  public Value readRegisterIgnoreLocal(int register, ValueType type) {
     DebugLocalInfo local = getCurrentLocal(register);
     return readRegister(register, type, currentBlock, EdgeType.NON_EDGE, local);
   }
 
-  public Value readRegister(int register, MoveType type, BasicBlock block, EdgeType readingEdge,
+  public Value readRegister(int register, ValueType type, BasicBlock block, EdgeType readingEdge,
       DebugLocalInfo local) {
     checkRegister(register);
     Value value = block.readCurrentDefinition(register, readingEdge);
@@ -1653,7 +1628,7 @@
   }
 
   private Value readRegisterRecursive(
-      int register, BasicBlock block, EdgeType readingEdge, MoveType type, DebugLocalInfo local) {
+      int register, BasicBlock block, EdgeType readingEdge, ValueType type, DebugLocalInfo local) {
     Value value;
     if (!block.isSealed()) {
       assert !blocks.isEmpty() : "No write to " + register;
@@ -1680,33 +1655,33 @@
   }
 
   public Value readNumericRegister(int register, NumericType type) {
-    return readRegister(register, type.moveTypeFor());
+    return readRegister(register, ValueType.fromNumericType(type));
   }
 
   public Value readLiteral(NumericType type, long constant) {
-    Value value = new Value(valueNumberGenerator.next(), MoveType.fromNumericType(type), null);
-    add(new ConstNumber(ConstType.fromNumericType(type), value, constant));
+    Value value = new Value(valueNumberGenerator.next(), ValueType.fromNumericType(type), null);
+    add(new ConstNumber(ValueType.fromNumericType(type), value, constant));
     return value;
   }
 
   // This special write register is needed when changing the scoping of a local variable.
   // See addDebugLocalStart and addDebugLocalEnd.
   private Value writeRegister(
-      int register, MoveType type, ThrowingInfo throwing, DebugLocalInfo local) {
+      int register, ValueType type, ThrowingInfo throwing, DebugLocalInfo local) {
     checkRegister(register);
     Value value = new Value(valueNumberGenerator.next(), type, local);
     currentBlock.writeCurrentDefinition(register, value, throwing);
     return value;
   }
 
-  public Value writeRegister(int register, MoveType type, ThrowingInfo throwing) {
+  public Value writeRegister(int register, ValueType type, ThrowingInfo throwing) {
     DebugLocalInfo local = getCurrentLocal(register);
     previousLocalValue = local == null ? null : readRegisterIgnoreLocal(register, type);
     return writeRegister(register, type, throwing, local);
   }
 
   public Value writeNumericRegister(int register, NumericType type, ThrowingInfo throwing) {
-    return writeRegister(register, type.moveTypeFor(), throwing);
+    return writeRegister(register, ValueType.fromNumericType(type), throwing);
   }
 
   private DebugLocalInfo getCurrentLocal(int register) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
index 3cd2b57..c966690 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
@@ -22,14 +22,13 @@
 import com.android.tools.r8.graph.JarApplicationReader;
 import com.android.tools.r8.ir.code.CatchHandlers;
 import com.android.tools.r8.ir.code.Cmp.Bias;
-import com.android.tools.r8.ir.code.ConstType;
 import com.android.tools.r8.ir.code.If;
 import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.code.Monitor;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.code.Position;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder.BlockInfo;
 import com.android.tools.r8.ir.conversion.JarState.Local;
 import com.android.tools.r8.ir.conversion.JarState.Slot;
@@ -246,9 +245,9 @@
   @Override
   public void buildPrelude(IRBuilder builder) {
     // Record types for arguments.
-    Int2ReferenceMap<MoveType> argumentLocals = recordArgumentTypes();
-    Int2ReferenceMap<MoveType> initializedLocals = new Int2ReferenceOpenHashMap<>(argumentLocals);
-    Int2ReferenceMap<ConstType> uninitializedLocals = new Int2ReferenceOpenHashMap<>();
+    Int2ReferenceMap<ValueType> argumentLocals = recordArgumentTypes();
+    Int2ReferenceMap<ValueType> initializedLocals = new Int2ReferenceOpenHashMap<>(argumentLocals);
+    Int2ReferenceMap<ValueType> uninitializedLocals = new Int2ReferenceOpenHashMap<>();
     // Initialize all non-argument locals to ensure safe insertion of debug-local instructions.
     for (Object o : node.localVariables) {
       LocalVariableNode local = (LocalVariableNode) o;
@@ -271,13 +270,14 @@
           break;
       }
       int localRegister = state.getLocalRegister(local.index, localType);
-      MoveType existingLocalType = initializedLocals.get(localRegister);
-      assert existingLocalType == null || existingLocalType == moveType(localType);
+      ValueType existingLocalType = initializedLocals.get(localRegister);
+      ValueType localValueType = valueType(localType);
+      assert existingLocalType == null || existingLocalType.compatible(localValueType);
       if (existingLocalType == null) {
         int localRegister2 = state.writeLocal(local.index, localType);
         assert localRegister == localRegister2;
-        initializedLocals.put(localRegister, moveType(localType));
-        uninitializedLocals.put(localRegister, constType(localType));
+        initializedLocals.put(localRegister, localValueType);
+        uninitializedLocals.put(localRegister, localValueType);
       }
     }
 
@@ -295,7 +295,7 @@
     // for arguments.
     buildArgumentInstructions(builder);
 
-    for (Entry<ConstType> entry : uninitializedLocals.int2ReferenceEntrySet()) {
+    for (Entry<ValueType> entry : uninitializedLocals.int2ReferenceEntrySet()) {
       builder.addDebugUninitialized(entry.getIntKey(), entry.getValue());
     }
 
@@ -337,31 +337,31 @@
       builder.addThisArgument(slot.register);
     }
     for (Type type : parameterTypes) {
-      MoveType moveType = moveType(type);
+      ValueType valueType = valueType(type);
       Slot slot = state.readLocal(argumentRegister, type);
       if (type == Type.BOOLEAN_TYPE) {
         builder.addBooleanNonThisArgument(slot.register);
       } else {
-        builder.addNonThisArgument(slot.register, moveType);
+        builder.addNonThisArgument(slot.register, valueType);
       }
-      argumentRegister += moveType.requiredRegisters();
+      argumentRegister += valueType.requiredRegisters();
     }
   }
 
-  private Int2ReferenceMap<MoveType> recordArgumentTypes() {
-    Int2ReferenceMap<MoveType> initializedLocals =
+  private Int2ReferenceMap<ValueType> recordArgumentTypes() {
+    Int2ReferenceMap<ValueType> initializedLocals =
         new Int2ReferenceOpenHashMap<>(node.localVariables.size());
     int argumentRegister = 0;
     if (!isStatic()) {
       Type thisType = Type.getType(clazz.descriptor.toString());
       int register = state.writeLocal(argumentRegister++, thisType);
-      initializedLocals.put(register, moveType(thisType));
+      initializedLocals.put(register, valueType(thisType));
     }
     for (Type type : parameterTypes) {
-      MoveType moveType = moveType(type);
+      ValueType valueType = valueType(type);
       int register = state.writeLocal(argumentRegister, type);
-      argumentRegister += moveType.requiredRegisters();
-      initializedLocals.put(register, moveType);
+      argumentRegister += valueType.requiredRegisters();
+      initializedLocals.put(register, valueType);
     }
     return initializedLocals;
   }
@@ -804,49 +804,27 @@
 
   // Type conversion helpers.
 
-  private static MoveType moveType(Type type) {
+  private static ValueType valueType(Type type) {
     switch (type.getSort()) {
       case Type.ARRAY:
       case Type.OBJECT:
-        return MoveType.OBJECT;
+        return ValueType.OBJECT;
       case Type.BOOLEAN:
       case Type.BYTE:
       case Type.SHORT:
       case Type.CHAR:
       case Type.INT:
+        return ValueType.INT;
       case Type.FLOAT:
-        return MoveType.SINGLE;
+        return ValueType.FLOAT;
       case Type.LONG:
+        return ValueType.LONG;
       case Type.DOUBLE:
-        return MoveType.WIDE;
+        return ValueType.DOUBLE;
       case Type.VOID:
         // Illegal. Throws in fallthrough.
       default:
-        throw new Unreachable("Invalid type in moveType: " + type);
-    }
-  }
-
-  private static ConstType constType(Type type) {
-    switch (type.getSort()) {
-      case Type.ARRAY:
-      case Type.OBJECT:
-        return ConstType.OBJECT;
-      case Type.BOOLEAN:
-      case Type.BYTE:
-      case Type.SHORT:
-      case Type.CHAR:
-      case Type.INT:
-        return ConstType.INT;
-      case Type.FLOAT:
-        return ConstType.FLOAT;
-      case Type.LONG:
-        return ConstType.LONG;
-      case Type.DOUBLE:
-        return ConstType.DOUBLE;
-      case Type.VOID:
-        // Illegal. Throws in fallthrough.
-      default:
-        throw new Unreachable("Invalid type in constType: " + type);
+        throw new Unreachable("Invalid type in valueType: " + type);
     }
   }
 
@@ -1924,7 +1902,7 @@
         Slot value = state.peek();
         assert value.isCategory1();
         int copy = state.push(value.type);
-        builder.addMove(moveType(value.type), copy, value.register);
+        builder.addMove(valueType(value.type), copy, value.register);
         break;
       }
       case Opcodes.DUP_X1: {
@@ -1938,9 +1916,9 @@
         assert value2.register == stack2;
         assert value1.register == stack1;
         // stack0 is new top-of-stack.
-        builder.addMove(moveType(value1.type), stack0, stack1);
-        builder.addMove(moveType(value2.type), stack1, stack2);
-        builder.addMove(moveType(value1.type), stack2, stack0);
+        builder.addMove(valueType(value1.type), stack0, stack1);
+        builder.addMove(valueType(value2.type), stack1, stack2);
+        builder.addMove(valueType(value1.type), stack2, stack0);
         break;
       }
       case Opcodes.DUP_X2: {
@@ -1968,13 +1946,13 @@
           state.push(value1.type);
           int copy2 = state.push(value2.type);
           int copy1 = state.push(value1.type);
-          builder.addMove(moveType(value1.type), copy1, value1.register);
-          builder.addMove(moveType(value2.type), copy2, value2.register);
+          builder.addMove(valueType(value1.type), copy1, value1.register);
+          builder.addMove(valueType(value2.type), copy2, value2.register);
         } else {
           // Stack transformation: ..., w1 -> ..., w1, w1
           state.push(value1.type);
           int copy1 = state.push(value1.type);
-          builder.addMove(moveType(value1.type), copy1, value1.register);
+          builder.addMove(valueType(value1.type), copy1, value1.register);
         }
         break;
       }
@@ -2030,9 +2008,9 @@
         state.push(value1.type);
         state.push(value2.type);
         int tmp = state.push(value1.type);
-        builder.addMove(moveType(value1.type), tmp, value1.register);
-        builder.addMove(moveType(value2.type), value1.register, value2.register);
-        builder.addMove(moveType(value1.type), value2.register, tmp);
+        builder.addMove(valueType(value1.type), tmp, value1.register);
+        builder.addMove(valueType(value2.type), value1.register, value2.register);
+        builder.addMove(valueType(value1.type), value2.register, tmp);
         state.pop(); // Remove temp.
         break;
       }
@@ -2206,27 +2184,27 @@
       }
       case Opcodes.IRETURN: {
         Slot value = state.pop(Type.INT_TYPE);
-        addReturn(insn, MoveType.SINGLE, value.register, builder);
+        addReturn(insn, ValueType.INT, value.register, builder);
         break;
       }
       case Opcodes.LRETURN: {
         Slot value = state.pop(Type.LONG_TYPE);
-        addReturn(insn, MoveType.WIDE, value.register, builder);
+        addReturn(insn, ValueType.LONG, value.register, builder);
         break;
       }
       case Opcodes.FRETURN: {
         Slot value = state.pop(Type.FLOAT_TYPE);
-        addReturn(insn, MoveType.SINGLE, value.register, builder);
+        addReturn(insn, ValueType.FLOAT, value.register, builder);
         break;
       }
       case Opcodes.DRETURN: {
         Slot value = state.pop(Type.DOUBLE_TYPE);
-        addReturn(insn, MoveType.WIDE, value.register, builder);
+        addReturn(insn, ValueType.DOUBLE, value.register, builder);
         break;
       }
       case Opcodes.ARETURN: {
         Slot obj = state.pop(JarState.REFERENCE_TYPE);
-        addReturn(insn, MoveType.OBJECT, obj.register, builder);
+        addReturn(insn, ValueType.OBJECT, obj.register, builder);
         break;
       }
       case Opcodes.RETURN: {
@@ -2279,7 +2257,7 @@
     builder.addThrow(register);
   }
 
-  private void addReturn(InsnNode insn, MoveType type, int register, IRBuilder builder) {
+  private void addReturn(InsnNode insn, ValueType type, int register, IRBuilder builder) {
     processLocalVariablesAtExit(insn, builder);
     if (type == null) {
       assert register == -1;
@@ -2297,10 +2275,10 @@
     assert value3.register == stack3;
     assert value2.register == stack2;
     assert value1.register == stack1;
-    builder.addMove(moveType(value1.type), stack0, stack1);
-    builder.addMove(moveType(value2.type), stack1, stack2);
-    builder.addMove(moveType(value3.type), stack2, stack3);
-    builder.addMove(moveType(value1.type), stack3, stack0);
+    builder.addMove(valueType(value1.type), stack0, stack1);
+    builder.addMove(valueType(value2.type), stack1, stack2);
+    builder.addMove(valueType(value3.type), stack2, stack3);
+    builder.addMove(valueType(value1.type), stack3, stack0);
   }
 
   private void dupOneBelowOne(Slot value2, Slot value1, IRBuilder builder) {
@@ -2309,9 +2287,9 @@
     int stack0 = state.push(value1.type);
     assert value2.register == stack2;
     assert value1.register == stack1;
-    builder.addMove(moveType(value1.type), stack0, stack1);
-    builder.addMove(moveType(value2.type), stack1, stack2);
-    builder.addMove(moveType(value1.type), stack2, stack0);
+    builder.addMove(valueType(value1.type), stack0, stack1);
+    builder.addMove(valueType(value2.type), stack1, stack2);
+    builder.addMove(valueType(value1.type), stack2, stack0);
   }
 
   private void dupTwoBelowOne(Slot value3, Slot value2, Slot value1, IRBuilder builder) {
@@ -2323,11 +2301,11 @@
     assert value3.register == stack4;
     assert value2.register == stack3;
     assert value1.register == stack2;
-    builder.addMove(moveType(value1.type), stack0, stack2);
-    builder.addMove(moveType(value2.type), stack1, stack3);
-    builder.addMove(moveType(value3.type), stack2, stack4);
-    builder.addMove(moveType(value1.type), stack3, stack0);
-    builder.addMove(moveType(value2.type), stack4, stack1);
+    builder.addMove(valueType(value1.type), stack0, stack2);
+    builder.addMove(valueType(value2.type), stack1, stack3);
+    builder.addMove(valueType(value3.type), stack2, stack4);
+    builder.addMove(valueType(value1.type), stack3, stack0);
+    builder.addMove(valueType(value2.type), stack4, stack1);
   }
 
   private void dupTwoBelowTwo(Slot value4, Slot value3, Slot value2, Slot value1,
@@ -2342,12 +2320,12 @@
     assert value3.register == stack4;
     assert value2.register == stack3;
     assert value1.register == stack2;
-    builder.addMove(moveType(value1.type), stack0, stack2);
-    builder.addMove(moveType(value2.type), stack1, stack3);
-    builder.addMove(moveType(value3.type), stack2, stack4);
-    builder.addMove(moveType(value3.type), stack3, stack5);
-    builder.addMove(moveType(value1.type), stack4, stack0);
-    builder.addMove(moveType(value2.type), stack5, stack1);
+    builder.addMove(valueType(value1.type), stack0, stack2);
+    builder.addMove(valueType(value2.type), stack1, stack3);
+    builder.addMove(valueType(value3.type), stack2, stack4);
+    builder.addMove(valueType(value3.type), stack3, stack5);
+    builder.addMove(valueType(value1.type), stack4, stack0);
+    builder.addMove(valueType(value2.type), stack5, stack1);
   }
 
   private void buildConversion(Type from, Type to, IRBuilder builder) {
@@ -2411,12 +2389,12 @@
     if (Opcodes.ILOAD <= opcode && opcode <= Opcodes.ALOAD) {
       Slot src = state.readLocal(insn.var, expectedType);
       int dest = state.push(src.type);
-      builder.addMove(moveType(src.type), dest, src.register);
+      builder.addMove(valueType(src.type), dest, src.register);
     } else {
       assert Opcodes.ISTORE <= opcode && opcode <= Opcodes.ASTORE;
       Slot src = state.pop(expectedType);
       int dest = state.writeLocal(insn.var, src.type);
-      builder.addMove(moveType(src.type), dest, src.register);
+      builder.addMove(valueType(src.type), dest, src.register);
     }
   }
 
@@ -2511,7 +2489,7 @@
       Type methodOwner,
       boolean addImplicitReceiver,
       IRBuilder builder,
-      ThrowingBiConsumer<List<MoveType>, List<Integer>, ApiLevelException> creator)
+      ThrowingBiConsumer<List<ValueType>, List<Integer>, ApiLevelException> creator)
       throws ApiLevelException {
 
     // Build the argument list of the form [owner, param1, ..., paramN].
@@ -2519,7 +2497,7 @@
     Type[] parameterTypes = Type.getArgumentTypes(methodDesc);
     Slot[] parameterRegisters = state.popReverse(parameterTypes.length);
 
-    List<MoveType> types = new ArrayList<>(parameterTypes.length + 1);
+    List<ValueType> types = new ArrayList<>(parameterTypes.length + 1);
     List<Integer> registers = new ArrayList<>(parameterTypes.length + 1);
 
     // Add receiver argument for non-static calls.
@@ -2539,17 +2517,17 @@
     Type returnType = Type.getReturnType(methodDesc);
     if (returnType != Type.VOID_TYPE) {
       if (returnType == Type.BOOLEAN_TYPE) {
-        builder.addBooleanMoveResult(moveType(returnType), state.push(returnType));
+        builder.addBooleanMoveResult(valueType(returnType), state.push(returnType));
       } else {
-        builder.addMoveResult(moveType(returnType), state.push(returnType));
+        builder.addMoveResult(valueType(returnType), state.push(returnType));
       }
     }
   }
 
-  private static void addArgument(List<MoveType> types, List<Integer> registers, Type type,
+  private static void addArgument(List<ValueType> types, List<Integer> registers, Type type,
       Slot slot) {
     assert slot.isCompatibleWith(type);
-    types.add(moveType(type));
+    types.add(valueType(type));
     registers.add(slot.register);
   }
 
@@ -2787,7 +2765,7 @@
     }
     builder.addInvokeNewArray(dimArrayType, insn.dims, dimensions);
     int dimensionsDestTemp = state.push(INT_ARRAY_TYPE);
-    builder.addMoveResult(MoveType.OBJECT, dimensionsDestTemp);
+    builder.addMoveResult(ValueType.OBJECT, dimensionsDestTemp);
     // Push the class object for the member type of the array.
     int classDestTemp = state.push(CLASS_TYPE);
     builder.ensureBlockForThrowingInstruction();
@@ -2796,7 +2774,7 @@
     DexType reflectArrayClass = application.getTypeFromDescriptor(REFLECT_ARRAY_DESC);
     DexMethod newInstance = application.getMethod(reflectArrayClass,
         REFLECT_ARRAY_NEW_INSTANCE_NAME, REFLECT_ARRAY_NEW_INSTANCE_DESC);
-    List<MoveType> argumentTypes = Arrays.asList(moveType(CLASS_TYPE), moveType(INT_ARRAY_TYPE));
+    List<ValueType> argumentTypes = Arrays.asList(valueType(CLASS_TYPE), valueType(INT_ARRAY_TYPE));
     List<Integer> argumentRegisters = Arrays.asList(classDestTemp, dimensionsDestTemp);
     builder.ensureBlockForThrowingInstruction();
     builder.addInvoke(Invoke.Type.STATIC, newInstance, null, argumentTypes, argumentRegisters);
@@ -2804,7 +2782,7 @@
     state.pop(); // classDestTemp.
     state.pop(); // dimensionsDestTemp.
     int result = state.push(arrayType);
-    builder.addMoveResult(moveType(arrayType), result);
+    builder.addMoveResult(valueType(arrayType), result);
     // Insert cast check to satisfy verification.
     builder.ensureBlockForThrowingInstruction();
     builder.addCheckCast(result, dexArrayType);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/AccessorMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/AccessorMethodSourceCode.java
index 2460798..551d629 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/AccessorMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/AccessorMethodSourceCode.java
@@ -11,7 +11,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.ir.code.Invoke;
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import java.util.ArrayList;
 import java.util.List;
@@ -88,39 +88,39 @@
     DexType[] accessorParams = proto.parameters.values;
 
     // Prepare call arguments.
-    List<MoveType> argMoveTypes = new ArrayList<>();
+    List<ValueType> argValueTypes = new ArrayList<>();
     List<Integer> argRegisters = new ArrayList<>();
 
     // If we are delegating to a constructor, we need to create the instance
     // first. This instance will be the first argument to the call.
     if (delegatingToConstructor()) {
-      int instance = nextRegister(MoveType.OBJECT);
+      int instance = nextRegister(ValueType.OBJECT);
       add(builder -> builder.addNewInstance(instance, implMethod.holder));
-      argMoveTypes.add(MoveType.OBJECT);
+      argValueTypes.add(ValueType.OBJECT);
       argRegisters.add(instance);
     }
 
     for (int i = 0; i < accessorParams.length; i++) {
       DexType param = accessorParams[i];
-      argMoveTypes.add(MoveType.fromDexType(param));
+      argValueTypes.add(ValueType.fromDexType(param));
       argRegisters.add(getParamRegister(i));
     }
 
     // Method call to the original impl-method.
     add(builder -> builder.addInvoke(inferInvokeType(),
-        implMethod, implMethod.proto, argMoveTypes, argRegisters));
+        implMethod, implMethod.proto, argValueTypes, argRegisters));
 
     // Does the method have return value?
     if (proto.returnType == factory().voidType) {
       add(IRBuilder::addReturn);
     } else if (delegatingToConstructor()) {
       // Return newly created instance
-      add(builder -> builder.addReturn(MoveType.OBJECT, argRegisters.get(0)));
+      add(builder -> builder.addReturn(ValueType.OBJECT, argRegisters.get(0)));
     } else {
-      MoveType moveType = MoveType.fromDexType(proto.returnType);
-      int tempValue = nextRegister(moveType);
-      add(builder -> builder.addMoveResult(moveType, tempValue));
-      add(builder -> builder.addReturn(moveType, tempValue));
+      ValueType valueType = ValueType.fromDexType(proto.returnType);
+      int tempValue = nextRegister(valueType);
+      add(builder -> builder.addMoveResult(valueType, tempValue));
+      add(builder -> builder.addReturn(valueType, tempValue));
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaBridgeMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaBridgeMethodSourceCode.java
index cc4f1f2..20286a8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaBridgeMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaBridgeMethodSourceCode.java
@@ -7,7 +7,7 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.Invoke;
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import java.util.ArrayList;
 import java.util.List;
@@ -28,33 +28,33 @@
     DexType[] enforcedParams = descriptor().enforcedProto.parameters.values;
 
     // Prepare call arguments.
-    List<MoveType> argMoveTypes = new ArrayList<>();
+    List<ValueType> argValueTypes = new ArrayList<>();
     List<Integer> argRegisters = new ArrayList<>();
 
     // Always add a receiver representing 'this' of the lambda class.
-    argMoveTypes.add(MoveType.OBJECT);
+    argValueTypes.add(ValueType.OBJECT);
     argRegisters.add(getReceiverRegister());
 
     // Prepare arguments.
     for (int i = 0; i < currentParams.length; i++) {
       DexType expectedParamType = enforcedParams[i];
-      argMoveTypes.add(MoveType.fromDexType(expectedParamType));
+      argValueTypes.add(ValueType.fromDexType(expectedParamType));
       argRegisters.add(enforceParameterType(
           getParamRegister(i), currentParams[i], expectedParamType));
     }
 
     // Method call to the main functional interface method.
     add(builder -> builder.addInvoke(Invoke.Type.VIRTUAL,
-        this.mainMethod, this.mainMethod.proto, argMoveTypes, argRegisters));
+        this.mainMethod, this.mainMethod.proto, argValueTypes, argRegisters));
 
     // Does the method have return value?
     if (proto.returnType == factory().voidType) {
       add(IRBuilder::addReturn);
     } else {
-      MoveType moveType = MoveType.fromDexType(proto.returnType);
-      int tempValue = nextRegister(moveType);
-      add(builder -> builder.addMoveResult(moveType, tempValue));
-      add(builder -> builder.addReturn(moveType, tempValue));
+      ValueType valueType = ValueType.fromDexType(proto.returnType);
+      int tempValue = nextRegister(valueType);
+      add(builder -> builder.addMoveResult(valueType, tempValue));
+      add(builder -> builder.addReturn(valueType, tempValue));
     }
   }
 }
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
index 411ab4c..ea891ea 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClassConstructorSourceCode.java
@@ -6,7 +6,7 @@
 
 import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.ir.code.MemberType;
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import java.util.Collections;
 
@@ -22,11 +22,11 @@
   @Override
   protected void prepareInstructions() {
     // Create and initialize an instance.
-    int instance = nextRegister(MoveType.OBJECT);
+    int instance = nextRegister(ValueType.OBJECT);
     add(builder -> builder.addNewInstance(instance, lambda.type));
     add(builder -> builder.addInvoke(
         Invoke.Type.DIRECT, lambda.constructor, lambda.constructor.proto,
-        Collections.singletonList(MoveType.OBJECT), Collections.singletonList(instance)));
+        Collections.singletonList(ValueType.OBJECT), Collections.singletonList(instance)));
 
     // Assign to a field.
     add(builder -> builder.addStaticPut(MemberType.OBJECT, instance, lambda.instanceField));
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
index a4de54f..40911e5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaMainMethodSourceCode.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.ir.code.MemberType;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.NumericType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.google.common.collect.Lists;
 import java.util.ArrayList;
@@ -212,15 +212,15 @@
         constructorTarget ? target.callTarget.holder : implReturnType);
 
     // Prepare call arguments.
-    List<MoveType> argMoveTypes = new ArrayList<>();
+    List<ValueType> argValueTypes = new ArrayList<>();
     List<Integer> argRegisters = new ArrayList<>();
 
     // If the target is a constructor, we need to create the instance first.
     // This instance will be the first argument to the call.
     if (constructorTarget) {
-      int instance = nextRegister(MoveType.OBJECT);
+      int instance = nextRegister(ValueType.OBJECT);
       add(builder -> builder.addNewInstance(instance, methodToCall.holder));
-      argMoveTypes.add(MoveType.OBJECT);
+      argValueTypes.add(ValueType.OBJECT);
       argRegisters.add(instance);
     }
 
@@ -228,10 +228,10 @@
     int capturedValues = capturedTypes.length;
     for (int i = 0; i < capturedValues; i++) {
       MemberType memberType = MemberType.fromDexType(capturedTypes[i]);
-      MoveType moveType = MemberType.moveTypeFor(memberType);
-      int register = nextRegister(moveType);
+      ValueType valueType = MemberType.moveTypeFor(memberType);
+      int register = nextRegister(valueType);
 
-      argMoveTypes.add(moveType);
+      argValueTypes.add(valueType);
       argRegisters.add(register);
 
       // Read field into tmp local.
@@ -243,14 +243,14 @@
     // Prepare arguments.
     for (int i = 0; i < erasedParams.length; i++) {
       DexType expectedParamType = implReceiverAndArgs.get(i + capturedValues);
-      argMoveTypes.add(MoveType.fromDexType(expectedParamType));
+      argValueTypes.add(ValueType.fromDexType(expectedParamType));
       argRegisters.add(prepareParameterValue(
           getParamRegister(i), erasedParams[i], enforcedParams[i], expectedParamType));
     }
 
     // Method call to the method implementing lambda or method-ref.
     add(builder -> builder.addInvoke(target.invokeType,
-        methodToCall, methodToCall.proto, argMoveTypes, argRegisters));
+        methodToCall, methodToCall.proto, argValueTypes, argRegisters));
 
     // Does the method have return value?
     if (enforcedReturnType.isVoidType()) {
@@ -261,15 +261,15 @@
       int adjustedValue = prepareReturnValue(instanceRegister,
           erasedReturnType, enforcedReturnType, methodToCall.holder);
       add(builder -> builder.addReturn(
-          MoveType.fromDexType(erasedReturnType), adjustedValue));
+          ValueType.fromDexType(erasedReturnType), adjustedValue));
     } else {
-      MoveType implMoveType = MoveType.fromDexType(implReturnType);
-      int tempValue = nextRegister(implMoveType);
-      add(builder -> builder.addMoveResult(implMoveType, tempValue));
+      ValueType implValueType = ValueType.fromDexType(implReturnType);
+      int tempValue = nextRegister(implValueType);
+      add(builder -> builder.addMoveResult(implValueType, tempValue));
       int adjustedValue = prepareReturnValue(tempValue,
           erasedReturnType, enforcedReturnType, methodToCall.proto.returnType);
-      MoveType adjustedMoveType = MoveType.fromDexType(erasedReturnType);
-      add(builder -> builder.addReturn(adjustedMoveType, adjustedValue));
+      ValueType adjustedValueType = ValueType.fromDexType(erasedReturnType);
+      add(builder -> builder.addReturn(adjustedValueType, adjustedValue));
     }
   }
 
@@ -379,7 +379,7 @@
           if (from != NumericType.BYTE) {
             break; // Only BYTE can be converted to SHORT via widening conversion.
           }
-          int result = nextRegister(MoveType.SINGLE);
+          int result = nextRegister(ValueType.INT);
           add(builder -> builder.addConversion(to, NumericType.INT, result, register));
           return result;
         }
@@ -394,7 +394,7 @@
           if (from == NumericType.FLOAT || from == NumericType.DOUBLE) {
             break; // Not a widening conversion.
           }
-          int result = nextRegister(MoveType.WIDE);
+          int result = nextRegister(ValueType.LONG);
           add(builder -> builder.addConversion(to, NumericType.INT, result, register));
           return result;
         }
@@ -403,14 +403,14 @@
           if (from == NumericType.DOUBLE) {
             break; // Not a widening conversion.
           }
-          int result = nextRegister(MoveType.SINGLE);
+          int result = nextRegister(ValueType.FLOAT);
           NumericType type = (from == NumericType.LONG) ? NumericType.LONG : NumericType.INT;
           add(builder -> builder.addConversion(to, type, result, register));
           return result;
         }
 
         case DOUBLE: {
-          int result = nextRegister(MoveType.WIDE);
+          int result = nextRegister(ValueType.DOUBLE);
           NumericType type = (from == NumericType.FLOAT || from == NumericType.LONG)
               ? from : NumericType.INT;
           add(builder -> builder.addConversion(to, type, result, register));
@@ -462,14 +462,14 @@
   private int addPrimitiveUnboxing(int register, DexType primitiveType, DexType boxType) {
     DexMethod method = getUnboxMethod(primitiveType.descriptor.content[0], boxType);
 
-    List<MoveType> argMoveTypes = Collections.singletonList(MoveType.OBJECT);
+    List<ValueType> argValueTypes = Collections.singletonList(ValueType.OBJECT);
     List<Integer> argRegisters = Collections.singletonList(register);
     add(builder -> builder.addInvoke(Invoke.Type.VIRTUAL,
-        method, method.proto, argMoveTypes, argRegisters));
+        method, method.proto, argValueTypes, argRegisters));
 
-    MoveType moveType = MoveType.fromDexType(primitiveType);
-    int result = nextRegister(moveType);
-    add(builder -> builder.addMoveResult(moveType, result));
+    ValueType valueType = ValueType.fromDexType(primitiveType);
+    int result = nextRegister(valueType);
+    add(builder -> builder.addMoveResult(valueType, result));
     return result;
   }
 
@@ -484,14 +484,14 @@
     DexProto proto = factory.createProto(boxType, primitiveType);
     DexMethod method = factory.createMethod(boxType, proto, factory.valueOfMethodName);
 
-    MoveType moveType = MoveType.fromDexType(primitiveType);
-    List<MoveType> argMoveTypes = Collections.singletonList(moveType);
+    ValueType valueType = ValueType.fromDexType(primitiveType);
+    List<ValueType> argValueTypes = Collections.singletonList(valueType);
     List<Integer> argRegisters = Collections.singletonList(register);
     add(builder -> builder.addInvoke(Invoke.Type.STATIC,
-        method, method.proto, argMoveTypes, argRegisters));
+        method, method.proto, argValueTypes, argRegisters));
 
-    int result = nextRegister(MoveType.OBJECT);
-    add(builder -> builder.addMoveResult(MoveType.OBJECT, result));
+    int result = nextRegister(ValueType.OBJECT);
+    add(builder -> builder.addMoveResult(ValueType.OBJECT, result));
     return result;
   }
 }
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 f9a7f1f..aad7961 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
@@ -23,10 +23,10 @@
 import com.android.tools.r8.ir.code.InvokeCustom;
 import com.android.tools.r8.ir.code.InvokeDirect;
 import com.android.tools.r8.ir.code.MemberType;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.NewInstance;
 import com.android.tools.r8.ir.code.StaticGet;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import java.util.ArrayList;
 import java.util.IdentityHashMap;
@@ -278,7 +278,7 @@
     Value lambdaInstanceValue = invoke.outValue();
     if (lambdaInstanceValue == null) {
       // The out value might be empty in case it was optimized out.
-      lambdaInstanceValue = code.createValue(MoveType.OBJECT);
+      lambdaInstanceValue = code.createValue(ValueType.OBJECT);
     }
 
     // For stateless lambdas we replace InvokeCustom instruction with StaticGet
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/StringConcatRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/StringConcatRewriter.java
index 525310a..399ae92 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/StringConcatRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/StringConcatRewriter.java
@@ -20,9 +20,9 @@
 import com.android.tools.r8.ir.code.InvokeCustom;
 import com.android.tools.r8.ir.code.InvokeDirect;
 import com.android.tools.r8.ir.code.InvokeVirtual;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.NewInstance;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import com.google.common.collect.Lists;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -328,7 +328,7 @@
       instructions.previous();
 
       // new-instance v0, StringBuilder
-      Value sbInstance = code.createValue(MoveType.OBJECT);
+      Value sbInstance = code.createValue(ValueType.OBJECT);
       appendInstruction(new NewInstance(factory.stringBuilderType, sbInstance));
 
       // invoke-direct {v0}, void StringBuilder.<init>()
@@ -349,7 +349,7 @@
       Value concatValue = invokeCustom.outValue();
       if (concatValue == null) {
         // The out value might be empty in case it was optimized out.
-        concatValue = code.createValue(MoveType.OBJECT);
+        concatValue = code.createValue(ValueType.OBJECT);
       }
 
       // Replace the instruction.
@@ -427,7 +427,7 @@
 
       @Override
       Value getOrCreateValue() {
-        Value value = code.createValue(MoveType.OBJECT);
+        Value value = code.createValue(ValueType.OBJECT);
         appendInstruction(new ConstString(value, factory.createString(str)));
         return value;
       }
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 e948ace..96ccab1 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
@@ -37,7 +37,6 @@
 import com.android.tools.r8.ir.code.ConstInstruction;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.ConstString;
-import com.android.tools.r8.ir.code.ConstType;
 import com.android.tools.r8.ir.code.DebugLocalWrite;
 import com.android.tools.r8.ir.code.DominatorTree;
 import com.android.tools.r8.ir.code.Goto;
@@ -52,7 +51,6 @@
 import com.android.tools.r8.ir.code.InvokeNewArray;
 import com.android.tools.r8.ir.code.InvokeVirtual;
 import com.android.tools.r8.ir.code.MemberType;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.NewArrayEmpty;
 import com.android.tools.r8.ir.code.NewArrayFilledData;
 import com.android.tools.r8.ir.code.NumericType;
@@ -63,6 +61,7 @@
 import com.android.tools.r8.ir.code.StaticPut;
 import com.android.tools.r8.ir.code.Switch;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.code.Xor;
 import com.android.tools.r8.ir.conversion.OptimizationFeedback;
 import com.android.tools.r8.ir.optimize.SwitchUtils.EnumSwitchInfo;
@@ -503,7 +502,7 @@
               for (Integer outlier : outliers) {
                 if (outlier != 0) {
                   rewrittenSize += ConstNumber.estimatedDexSize(
-                      ConstType.fromMoveType(theSwitch.value().outType()), outlier);
+                      theSwitch.value().outType(), outlier);
                 }
                 rewrittenSize += If.estimatedDexSize();
               }
@@ -737,10 +736,11 @@
                 if (argumentIndex != -1 && checkArgumentType(invoke, target.method,
                     argumentIndex)) {
                   Value argument = invoke.arguments().get(argumentIndex);
-                  assert (invoke.outType() == argument.outType()) ||
-                      (invoke.outType() == MoveType.OBJECT
-                          && argument.outType() == MoveType.SINGLE
-                          && argument.isZero());
+                  assert invoke.outType().compatible(argument.outType())
+                      || (!options.outputClassFiles
+                            && invoke.outType() == ValueType.OBJECT
+                            && argument.outType().isSingle()
+                            && argument.isZero());
                   invoke.outValue().replaceUsers(argument);
                   invoke.setOutValue(null);
                 }
@@ -1851,7 +1851,7 @@
   }
 
   private Value addConstString(IRCode code, InstructionListIterator iterator, String s) {
-    Value value = code.createValue(MoveType.OBJECT);
+    Value value = code.createValue(ValueType.OBJECT);
     iterator.add(new ConstString(value, dexItemFactory.createString(s)));
     return value;
   }
@@ -1878,7 +1878,7 @@
 
     // Now that the block is split there should not be any catch handlers in the block.
     assert !block.hasCatchHandlers();
-    Value out = code.createValue(MoveType.OBJECT);
+    Value out = code.createValue(ValueType.OBJECT);
     DexType javaLangSystemType = dexItemFactory.createType("Ljava/lang/System;");
     DexType javaIoPrintStreamType = dexItemFactory.createType("Ljava/io/PrintStream;");
 
@@ -1890,11 +1890,11 @@
         new StaticGet(MemberType.OBJECT, out,
             dexItemFactory.createField(javaLangSystemType, javaIoPrintStreamType, "out")));
 
-    Value value = code.createValue(MoveType.OBJECT);
+    Value value = code.createValue(ValueType.OBJECT);
     iterator.add(new ConstString(value, dexItemFactory.createString("INVOKE ")));
     iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, value)));
 
-    value = code.createValue(MoveType.OBJECT);
+    value = code.createValue(ValueType.OBJECT);
     iterator.add(
         new ConstString(value, dexItemFactory.createString(method.method.qualifiedName())));
     iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, value)));
@@ -1920,7 +1920,7 @@
       eol.link(successor);
 
       Value argument = arguments.get(i);
-      if (argument.outType() != MoveType.OBJECT) {
+      if (argument.outType() != ValueType.OBJECT) {
         iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, primitive)));
       } else {
         // Insert "if (argument != null) ...".
@@ -1948,7 +1948,7 @@
         iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, nul)));
         iterator = isNotNullBlock.listIterator();
         iterator.setInsertionPosition(position);
-        value = code.createValue(MoveType.OBJECT);
+        value = code.createValue(ValueType.OBJECT);
         iterator.add(new InvokeVirtual(dexItemFactory.objectMethods.getClass, value,
             ImmutableList.of(arguments.get(i))));
         iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, value)));
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 d71febe..bad56c1 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
@@ -13,16 +13,15 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.ConstNumber;
-import com.android.tools.r8.ir.code.ConstType;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.InstancePut;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionIterator;
 import com.android.tools.r8.ir.code.InvokeMethod;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.StaticGet;
 import com.android.tools.r8.ir.code.StaticPut;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.ProguardMemberRule;
 
@@ -72,19 +71,18 @@
       ProguardMemberRule rule, IRCode code, Instruction instruction) {
     // Check if this value can be assumed constant.
     Instruction replacement = null;
-    MoveType moveType = instruction.outValue().outType();
+    ValueType valueType = instruction.outValue().outType();
     if (rule != null && rule.hasReturnValue() && rule.getReturnValue().isSingleValue()) {
-      assert moveType != MoveType.OBJECT;
-      Value value = code.createValue(moveType, instruction.getLocalInfo());
-      replacement = new ConstNumber(
-          ConstType.fromMoveType(moveType), value, rule.getReturnValue().getSingleValue());
+      assert valueType != ValueType.OBJECT;
+      Value value = code.createValue(valueType, instruction.getLocalInfo());
+      replacement = new ConstNumber(valueType, value, rule.getReturnValue().getSingleValue());
     }
     if (replacement == null &&
         rule != null && rule.hasReturnValue() && rule.getReturnValue().isField()) {
       DexField field = rule.getReturnValue().getField();
       DexEncodedField staticField = appInfo.lookupStaticTarget(field.clazz, field);
       if (staticField != null) {
-        Value value = code.createValue(moveType, instruction.getLocalInfo());
+        Value value = code.createValue(valueType, instruction.getLocalInfo());
         replacement = staticField.staticValue.asConstInstruction(false, value);
       } else {
         throw new CompilationError(field.clazz.toSourceString() + "." + field.name.toString() +
@@ -165,15 +163,10 @@
             }
             if (target.getOptimizationInfo().returnsConstant()) {
               long constant = target.getOptimizationInfo().getReturnedConstant();
-              MoveType moveType = invoke.outType();
-              if (moveType == MoveType.OBJECT) {
-                assert constant == 0;
-                moveType = MoveType.SINGLE;
-              }
-              Value value = code.createValue(moveType);
+              ValueType valueType = invoke.outType();
+              Value value = code.createValue(valueType);
               // TODO(ager): Attempt to get a more precise const type from the method analysis?
-              Instruction knownConstReturn =
-                  new ConstNumber(ConstType.fromMoveType(moveType), value, constant);
+              Instruction knownConstReturn = new ConstNumber(valueType, value, constant);
               invoke.outValue().replaceUsers(value);
               knownConstReturn.setPosition(invoke.getPosition());
               iterator.add(knownConstReturn);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MoveEliminator.java b/src/main/java/com/android/tools/r8/ir/optimize/MoveEliminator.java
index a228b20..dd7767a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MoveEliminator.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MoveEliminator.java
@@ -5,7 +5,6 @@
 
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.Move;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.regalloc.RegisterAllocator;
 import java.util.HashSet;
@@ -35,7 +34,7 @@
           return true;
         }
         if (activeMoveDstRegister == moveSrcRegister && activeMoveSrcRegister == moveDstRegister) {
-          if (move.outType() != MoveType.WIDE) {
+          if (!move.outType().isWide()) {
             return true;
           }
           // If the move is wide make sure the register pair is non-overlapping.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
index d799e7d..67e58cb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
@@ -37,13 +37,13 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.InvokeStatic;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Mul;
 import com.android.tools.r8.ir.code.NewInstance;
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.Rem;
 import com.android.tools.r8.ir.code.Sub;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.SourceCode;
 import com.android.tools.r8.naming.ClassNameMapper;
@@ -863,8 +863,8 @@
     public void buildPrelude(IRBuilder builder) {
       // Fill in the Argument instructions in the argument block.
       for (int i = 0; i < outline.arguments.size(); i++) {
-        MoveType moveType = outline.arguments.get(i).outType();
-        builder.addNonThisArgument(i, moveType);
+        ValueType valueType = outline.arguments.get(i).outType();
+        builder.addNonThisArgument(i, valueType);
       }
     }
 
@@ -879,7 +879,7 @@
         if (outline.returnType == dexItemFactory.voidType) {
           builder.addReturn();
         } else {
-          builder.addReturn(MoveType.fromDexType(outline.returnType), outline.argumentCount());
+          builder.addReturn(ValueType.fromDexType(outline.returnType), outline.argumentCount());
         }
         return;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
index 39f622c..8f6ae85 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionListIterator;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator;
 import com.android.tools.r8.ir.regalloc.LiveIntervals;
@@ -294,7 +293,7 @@
               // Insert the current constant in the mapping. Make sure to clobber the second
               // register if wide.
               registerToNumber.put(outRegister, current.asConstNumber());
-              if (current.outType() == MoveType.WIDE) {
+              if (current.outType().isWide()) {
                 registerToNumber.remove(outRegister + 1);
               }
             }
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 45edc8a..523d6db 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
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.ir.regalloc;
 
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.DebugLocalInfo;
 import com.android.tools.r8.ir.code.Add;
@@ -16,12 +17,12 @@
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.ir.code.Move;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.code.Or;
 import com.android.tools.r8.ir.code.Phi;
 import com.android.tools.r8.ir.code.Sub;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.code.Xor;
 import com.android.tools.r8.ir.regalloc.RegisterPositions.Type;
 import com.android.tools.r8.logging.Log;
@@ -1970,7 +1971,7 @@
     code.blocks.forEach(BasicBlock::clearUserInfo);
   }
 
-  private Value createValue(MoveType type) {
+  private Value createValue(ValueType type) {
     Value value = code.createValue(type, null);
     value.setNeedsRegister(true);
     return value;
@@ -2035,7 +2036,7 @@
   }
 
   private Value createSentinelRegisterValue() {
-    return createValue(MoveType.OBJECT);
+    return createValue(ValueType.OBJECT);
   }
 
   private LiveIntervals createSentinelLiveInterval(Value sentinelValue) {
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java b/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
index 3c2210d..4745a81 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
@@ -6,8 +6,8 @@
 import static com.android.tools.r8.dex.Constants.U16BIT_MAX;
 import static com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator.NO_REGISTER;
 
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.dex.Constants;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.utils.CfgPrinter;
 import java.util.ArrayList;
@@ -18,6 +18,7 @@
 public class LiveIntervals implements Comparable<LiveIntervals> {
 
   private final Value value;
+  private final MoveType type;
   private LiveIntervals nextConsecutive;
   private LiveIntervals previousConsecutive;
   private LiveIntervals splitParent;
@@ -40,6 +41,7 @@
 
   LiveIntervals(Value value) {
     this.value = value;
+    this.type = MoveType.fromValueType(value.outType());
     usedInMonitorOperations = value.usedInMonitorOperation();
     splitParent = this;
     value.setLiveIntervals(this);
@@ -48,6 +50,7 @@
   LiveIntervals(LiveIntervals splitParent) {
     this.splitParent = splitParent;
     value = splitParent.value;
+    type = splitParent.type;
     usedInMonitorOperations = splitParent.usedInMonitorOperations;
   }
 
@@ -60,7 +63,7 @@
   }
 
   public MoveType getType() {
-    return value.outType();
+    return type;
   }
 
   public Value getValue() {
@@ -68,7 +71,7 @@
   }
 
   public int requiredRegisters() {
-    return getType() == MoveType.WIDE ? 2 : 1;
+    return type == MoveType.WIDE ? 2 : 1;
   }
 
   public void setHint(LiveIntervals intervals) {
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
index 313497c..dd857fc 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.regalloc;
 
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.ir.code.Instruction;
-import com.android.tools.r8.ir.code.MoveType;
 import java.util.Map;
 import java.util.Set;
 
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMoveScheduler.java b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMoveScheduler.java
index 5d7606d..49b46dd 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMoveScheduler.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMoveScheduler.java
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.regalloc;
 
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.ir.code.ConstNumber;
 import com.android.tools.r8.ir.code.FixedRegisterValue;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.Move;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.Value;
 import java.util.ArrayList;
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMove.java b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMove.java
index c13d23e..70354fe 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMove.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMove.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.ir.regalloc;
 
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.code.MoveType;
 
 /**
  * A SpillMove represents either a phi move that transfers an SSA value to the SSA phi value or
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
index 9154eff..e466904 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
@@ -4,11 +4,11 @@
 
 package com.android.tools.r8.ir.regalloc;
 
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionListIterator;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Position;
 import java.util.Collection;
 import java.util.HashMap;
@@ -172,10 +172,10 @@
 
   private SpillMove getMoveWritingSourceRegister(SpillMove inMove, Collection<SpillMove> moves) {
     int srcRegister = inMove.from.getRegister();
-    int srcRegisters = inMove.type == MoveType.WIDE ? 2 : 1;
+    int srcRegisters = inMove.type.requiredRegisters();
     for (SpillMove move : moves) {
       int dstRegister = move.to.getRegister();
-      int dstRegisters = move.type == MoveType.WIDE ? 2 : 1;
+      int dstRegisters = move.type.requiredRegisters();
       for (int s = 0; s < srcRegisters; s++) {
         for (int d = 0; d < dstRegisters; d++) {
           if ((dstRegister + d) == (srcRegister + s)) {
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
index bcc9462..43e55ac 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.Invoke;
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.google.common.collect.Lists;
 import java.util.ArrayList;
@@ -74,32 +74,32 @@
   @Override
   protected void prepareInstructions() {
     // Prepare call arguments.
-    List<MoveType> argMoveTypes = new ArrayList<>();
+    List<ValueType> argValueTypes = new ArrayList<>();
     List<Integer> argRegisters = new ArrayList<>();
 
     if (receiver != null) {
-      argMoveTypes.add(MoveType.OBJECT);
+      argValueTypes.add(ValueType.OBJECT);
       argRegisters.add(getReceiverRegister());
     }
 
     DexType[] accessorParams = proto.parameters.values;
     for (int i = 0; i < accessorParams.length; i++) {
-      argMoveTypes.add(MoveType.fromDexType(accessorParams[i]));
+      argValueTypes.add(ValueType.fromDexType(accessorParams[i]));
       argRegisters.add(getParamRegister(i));
     }
 
     // Method call to the target method.
     add(builder -> builder.addInvoke(this.invokeType,
-        this.target, this.target.proto, argMoveTypes, argRegisters));
+        this.target, this.target.proto, argValueTypes, argRegisters));
 
     // Does the method return value?
     if (proto.returnType.isVoidType()) {
       add(IRBuilder::addReturn);
     } else {
-      MoveType moveType = MoveType.fromDexType(proto.returnType);
-      int tempValue = nextRegister(moveType);
-      add(builder -> builder.addMoveResult(moveType, tempValue));
-      add(builder -> builder.addReturn(moveType, tempValue));
+      ValueType valueType = ValueType.fromDexType(proto.returnType);
+      int tempValue = nextRegister(valueType);
+      add(builder -> builder.addMoveResult(valueType, tempValue));
+      add(builder -> builder.addReturn(valueType, tempValue));
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SingleBlockSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SingleBlockSourceCode.java
index 637cbac..ed4a207 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SingleBlockSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SingleBlockSourceCode.java
@@ -13,9 +13,9 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.Argument;
 import com.android.tools.r8.ir.code.CatchHandlers;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.SourceCode;
 import com.android.tools.r8.utils.ThrowingConsumer;
@@ -48,14 +48,14 @@
     this.proto = proto;
 
     // Initialize register values for receiver and arguments
-    this.receiverRegister = receiver != null ? nextRegister(MoveType.OBJECT) : -1;
+    this.receiverRegister = receiver != null ? nextRegister(ValueType.OBJECT) : -1;
 
     DexType[] params = proto.parameters.values;
     int paramCount = params.length;
     this.paramRegisters = new int[paramCount];
     this.paramValues = new Value[paramCount];
     for (int i = 0; i < paramCount; i++) {
-      this.paramRegisters[i] = nextRegister(MoveType.fromDexType(params[i]));
+      this.paramRegisters[i] = nextRegister(ValueType.fromDexType(params[i]));
     }
   }
 
@@ -63,9 +63,9 @@
     constructors.add(constructor);
   }
 
-  protected final int nextRegister(MoveType type) {
+  protected final int nextRegister(ValueType type) {
     int value = nextRegister;
-    nextRegister += type == MoveType.WIDE ? 2 : 1;
+    nextRegister += type.requiredRegisters();
     return value;
   }
 
@@ -147,7 +147,7 @@
   @Override
   public final void buildPrelude(IRBuilder builder) {
     if (receiver != null) {
-      receiverValue = builder.writeRegister(receiverRegister, MoveType.OBJECT, NO_THROW);
+      receiverValue = builder.writeRegister(receiverRegister, ValueType.OBJECT, NO_THROW);
       builder.add(new Argument(receiverValue));
       receiverValue.markAsThis();
     }
@@ -155,8 +155,8 @@
     // Fill in the Argument instructions in the argument block.
     DexType[] parameters = proto.parameters.values;
     for (int i = 0; i < parameters.length; i++) {
-      MoveType moveType = MoveType.fromDexType(parameters[i]);
-      Value paramValue = builder.writeRegister(paramRegisters[i], moveType, NO_THROW);
+      ValueType valueType = ValueType.fromDexType(parameters[i]);
+      Value paramValue = builder.writeRegister(paramRegisters[i], valueType, NO_THROW);
       paramValues[i] = paramValue;
       builder.add(new Argument(paramValue));
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/protolite/ProtoLitePruner.java b/src/main/java/com/android/tools/r8/shaking/protolite/ProtoLitePruner.java
index ced15f5..df3801b 100644
--- a/src/main/java/com/android/tools/r8/shaking/protolite/ProtoLitePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/protolite/ProtoLitePruner.java
@@ -24,9 +24,9 @@
 import com.android.tools.r8.ir.code.InvokeMethodWithReceiver;
 import com.android.tools.r8.ir.code.InvokeStatic;
 import com.android.tools.r8.ir.code.MemberType;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.Switch;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.optimize.SwitchUtils;
 import com.android.tools.r8.ir.optimize.SwitchUtils.EnumSwitchInfo;
 import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
@@ -471,9 +471,9 @@
               if (appInfo.withLiveness().liveFields.contains(field)) {
                 // Effectively inline the code that is normally inside these methods.
                 Value thisReference = invokeMethod.getReceiver();
-                Value newResult = code.createValue(MoveType.SINGLE);
+                Value newResult = code.createValue(ValueType.INT);
                 invokeMethod.outValue().replaceUsers(newResult);
-                Value theList = code.createValue(MoveType.OBJECT);
+                Value theList = code.createValue(ValueType.OBJECT);
                 it.replaceCurrentInstruction(
                     new InstanceGet(MemberType.OBJECT, theList, thisReference, field));
                 it.add(new InvokeInterface(sizeMethod, newResult, Collections.emptyList()));
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 9192b2f..0b7dafb 100644
--- a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
+++ b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
@@ -13,15 +13,14 @@
 import com.android.tools.r8.ir.code.Add;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.ConstNumber;
-import com.android.tools.r8.ir.code.ConstType;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionListIterator;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.code.ValueNumberGenerator;
+import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableList;
@@ -364,11 +363,11 @@
       BasicBlock newReturnBlock = iterator.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(), MoveType.SINGLE, null);
-      Value newReturnValue = new Value(test.valueNumberGenerator.next(), MoveType.SINGLE, null);
+      Value newConstValue = new Value(test.valueNumberGenerator.next(), ValueType.INT, null);
+      Value newReturnValue = new Value(test.valueNumberGenerator.next(), ValueType.INT, null);
       Value oldReturnValue = newReturnBlock.listIterator().next().asReturn().returnValue();
       newReturnBlock.listIterator().next().asReturn().returnValue().replaceUsers(newReturnValue);
-      Instruction constInstruction = new ConstNumber(ConstType.INT, newConstValue, 10);
+      Instruction constInstruction = new ConstNumber(ValueType.INT, newConstValue, 10);
       Instruction addInstruction =
           new Add(NumericType.INT, newReturnValue, oldReturnValue, newConstValue);
       iterator.previous();
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 6969c2d..726d6b1 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
@@ -8,11 +8,10 @@
 
 import com.android.tools.r8.ir.code.Add;
 import com.android.tools.r8.ir.code.ConstNumber;
-import com.android.tools.r8.ir.code.ConstType;
-import com.android.tools.r8.ir.code.MoveType;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.code.ValueType;
 import org.junit.Test;
 
 public class IdenticalAfterRegisterAllocationTest {
@@ -47,13 +46,13 @@
   @Test
   public void equalityOfConstantOperands() {
     RegisterAllocator allocator = new MockRegisterAllocator();
-    Value value0 = new Value(0, MoveType.SINGLE, null);
-    ConstNumber const0 = new ConstNumber(ConstType.INT, value0, 0);
-    Value value1 = new Value(1, MoveType.SINGLE, null);
-    ConstNumber const1 = new ConstNumber(ConstType.INT, value1, 1);
-    Value value2 = new Value(2, MoveType.SINGLE, null);
-    ConstNumber const2 = new ConstNumber(ConstType.INT, value2, 2);
-    Value value3 = new Value(2, MoveType.SINGLE, null);
+    Value value0 = new Value(0, ValueType.INT, null);
+    ConstNumber const0 = new ConstNumber(ValueType.INT, value0, 0);
+    Value value1 = new Value(1, ValueType.INT, null);
+    ConstNumber const1 = new ConstNumber(ValueType.INT, value1, 1);
+    Value value2 = new Value(2, ValueType.INT, null);
+    ConstNumber const2 = new ConstNumber(ValueType.INT, value2, 2);
+    Value value3 = new Value(2, ValueType.INT, null);
     Add add0 = new Add(NumericType.INT, value3, value0, value1);
     add0.setPosition(Position.none());
     Add add1 = new Add(NumericType.INT, value3, value0, value2);
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
index a1046db..140aef5 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
@@ -5,6 +5,7 @@
 
 import static org.junit.Assert.assertEquals;
 
+import com.android.tools.r8.code.MoveType;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.code.BasicBlock;
@@ -12,7 +13,7 @@
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.Move;
-import com.android.tools.r8.ir.code.MoveType;
+import com.android.tools.r8.ir.code.ValueType;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
@@ -124,9 +125,9 @@
     Move tempMove = moves.get(0);
     Move firstMove = moves.get(1);
     Move secondMove = moves.get(2);
-    assertEquals(MoveType.SINGLE, tempMove.outType());
-    assertEquals(MoveType.SINGLE, firstMove.outType());
-    assertEquals(MoveType.SINGLE, secondMove.outType());
+    assertEquals(ValueType.INT_OR_FLOAT, tempMove.outType());
+    assertEquals(ValueType.INT_OR_FLOAT, firstMove.outType());
+    assertEquals(ValueType.INT_OR_FLOAT, secondMove.outType());
     assertEquals(temp, tempMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(
         tempMove.src().asFixedRegisterValue().getRegister(),
@@ -149,9 +150,9 @@
     Move tempMove = moves.get(0);
     Move firstMove = moves.get(1);
     Move secondMove = moves.get(2);
-    assertEquals(MoveType.WIDE, tempMove.outType());
-    assertEquals(MoveType.WIDE, firstMove.outType());
-    assertEquals(MoveType.WIDE, secondMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, tempMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, firstMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, secondMove.outType());
     assertEquals(temp, tempMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(
         tempMove.src().asFixedRegisterValue().getRegister(),
@@ -174,9 +175,9 @@
     Move tempMove = moves.get(0).asMove();
     Move firstMove = moves.get(1).asMove();
     Move secondMove = moves.get(2).asMove();
-    assertEquals(MoveType.WIDE, tempMove.outType());
-    assertEquals(MoveType.SINGLE, firstMove.outType());
-    assertEquals(MoveType.WIDE, secondMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, tempMove.outType());
+    assertEquals(ValueType.INT_OR_FLOAT, firstMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, secondMove.outType());
     assertEquals(temp, tempMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(
         tempMove.src().asFixedRegisterValue().getRegister(),
@@ -199,9 +200,9 @@
     Move tempMove = moves.get(0).asMove();
     Move firstMove = moves.get(1).asMove();
     Move secondMove = moves.get(2).asMove();
-    assertEquals(MoveType.WIDE, tempMove.outType());
-    assertEquals(MoveType.SINGLE, firstMove.outType());
-    assertEquals(MoveType.WIDE, secondMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, tempMove.outType());
+    assertEquals(ValueType.INT_OR_FLOAT, firstMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, secondMove.outType());
     assertEquals(temp, tempMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(
         tempMove.src().asFixedRegisterValue().getRegister(),
@@ -223,8 +224,8 @@
     assertEquals(2, moves.size());
     Move firstMove = moves.get(0).asMove();
     Move secondMove = moves.get(1).asMove();
-    assertEquals(MoveType.WIDE, firstMove.outType());
-    assertEquals(MoveType.WIDE, secondMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, firstMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, secondMove.outType());
     assertEquals(0, firstMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(1, firstMove.src().asFixedRegisterValue().getRegister());
     assertEquals(2, secondMove.dest().asFixedRegisterValue().getRegister());
@@ -243,9 +244,9 @@
     Move firstMove = moves.get(0).asMove();
     Move secondMove = moves.get(1).asMove();
     Move thirdMove = moves.get(2).asMove();
-    assertEquals(MoveType.WIDE, firstMove.outType());
-    assertEquals(MoveType.WIDE, secondMove.outType());
-    assertEquals(MoveType.WIDE, thirdMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, firstMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, secondMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, thirdMove.outType());
     assertEquals(42, firstMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(1, firstMove.src().asFixedRegisterValue().getRegister());
     assertEquals(0, secondMove.dest().asFixedRegisterValue().getRegister());
@@ -268,10 +269,10 @@
     Move secondMove = moves.get(1).asMove();
     Move thirdMove = moves.get(2).asMove();
     Move fourthMove = moves.get(3).asMove();
-    assertEquals(MoveType.WIDE, firstMove.outType());
-    assertEquals(MoveType.SINGLE, secondMove.outType());
-    assertEquals(MoveType.SINGLE, thirdMove.outType());
-    assertEquals(MoveType.WIDE, fourthMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, firstMove.outType());
+    assertEquals(ValueType.INT_OR_FLOAT, secondMove.outType());
+    assertEquals(ValueType.INT_OR_FLOAT, thirdMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, fourthMove.outType());
     assertEquals(temp, firstMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(0, secondMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(1, thirdMove.dest().asFixedRegisterValue().getRegister());
@@ -290,9 +291,9 @@
     Move firstMove = moves.get(0).asMove();
     Move secondMove = moves.get(1).asMove();
     Move thirdMove = moves.get(2).asMove();
-    assertEquals(MoveType.WIDE, firstMove.outType());
-    assertEquals(MoveType.SINGLE, secondMove.outType());
-    assertEquals(MoveType.WIDE, thirdMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, firstMove.outType());
+    assertEquals(ValueType.INT_OR_FLOAT, secondMove.outType());
+    assertEquals(ValueType.LONG_OR_DOUBLE, thirdMove.outType());
     assertEquals(temp, firstMove.dest().asFixedRegisterValue().getRegister());
     assertEquals(2, firstMove.src().asFixedRegisterValue().getRegister());
     assertEquals(3, secondMove.dest().asFixedRegisterValue().getRegister());
