Merge "Refine type information for MemberType and remove unneeded type from ConstNumber."
diff --git a/src/main/java/com/android/tools/r8/code/Aget.java b/src/main/java/com/android/tools/r8/code/Aget.java
index db3d77c..063df5e 100644
--- a/src/main/java/com/android/tools/r8/code/Aget.java
+++ b/src/main/java/com/android/tools/r8/code/Aget.java
@@ -37,7 +37,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addArrayGet(MemberType.SINGLE, AA, BB, CC);
+    builder.addArrayGet(MemberType.INT_OR_FLOAT, AA, BB, CC);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/AgetWide.java b/src/main/java/com/android/tools/r8/code/AgetWide.java
index 904b37c..64c645d 100644
--- a/src/main/java/com/android/tools/r8/code/AgetWide.java
+++ b/src/main/java/com/android/tools/r8/code/AgetWide.java
@@ -37,7 +37,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addArrayGet(MemberType.WIDE, AA, BB, CC);
+    builder.addArrayGet(MemberType.LONG_OR_DOUBLE, AA, BB, CC);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Aput.java b/src/main/java/com/android/tools/r8/code/Aput.java
index db12a55..65e0721 100644
--- a/src/main/java/com/android/tools/r8/code/Aput.java
+++ b/src/main/java/com/android/tools/r8/code/Aput.java
@@ -37,7 +37,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addArrayPut(MemberType.SINGLE, AA, BB, CC);
+    builder.addArrayPut(MemberType.INT_OR_FLOAT, AA, BB, CC);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/AputWide.java b/src/main/java/com/android/tools/r8/code/AputWide.java
index eab00b9..286dfff 100644
--- a/src/main/java/com/android/tools/r8/code/AputWide.java
+++ b/src/main/java/com/android/tools/r8/code/AputWide.java
@@ -37,7 +37,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addArrayPut(MemberType.WIDE, AA, BB, CC);
+    builder.addArrayPut(MemberType.LONG_OR_DOUBLE, AA, BB, CC);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Iget.java b/src/main/java/com/android/tools/r8/code/Iget.java
index c08ec43..65ebb44 100644
--- a/src/main/java/com/android/tools/r8/code/Iget.java
+++ b/src/main/java/com/android/tools/r8/code/Iget.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class Iget extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstanceGet(MemberType.SINGLE, A, B, getField());
+    builder.addInstanceGet(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IgetBoolean.java b/src/main/java/com/android/tools/r8/code/IgetBoolean.java
index 02b3e27..756969c 100644
--- a/src/main/java/com/android/tools/r8/code/IgetBoolean.java
+++ b/src/main/java/com/android/tools/r8/code/IgetBoolean.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IgetBoolean extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstanceGet(MemberType.BOOLEAN, A, B, getField());
+    builder.addInstanceGet(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IgetByte.java b/src/main/java/com/android/tools/r8/code/IgetByte.java
index 5ac4379..56a239a 100644
--- a/src/main/java/com/android/tools/r8/code/IgetByte.java
+++ b/src/main/java/com/android/tools/r8/code/IgetByte.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IgetByte extends Format22c {
@@ -49,7 +48,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstanceGet(MemberType.BYTE, A, B, getField());
+    builder.addInstanceGet(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IgetChar.java b/src/main/java/com/android/tools/r8/code/IgetChar.java
index ff57556..ad9c44e 100644
--- a/src/main/java/com/android/tools/r8/code/IgetChar.java
+++ b/src/main/java/com/android/tools/r8/code/IgetChar.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IgetChar extends Format22c {
@@ -49,7 +48,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstanceGet(MemberType.CHAR, A, B, getField());
+    builder.addInstanceGet(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IgetObject.java b/src/main/java/com/android/tools/r8/code/IgetObject.java
index 80b9557..d0c7c00 100644
--- a/src/main/java/com/android/tools/r8/code/IgetObject.java
+++ b/src/main/java/com/android/tools/r8/code/IgetObject.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IgetObject extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstanceGet(MemberType.OBJECT, A, B, getField());
+    builder.addInstanceGet(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IgetShort.java b/src/main/java/com/android/tools/r8/code/IgetShort.java
index bd38b45..75a9752 100644
--- a/src/main/java/com/android/tools/r8/code/IgetShort.java
+++ b/src/main/java/com/android/tools/r8/code/IgetShort.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IgetShort extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstanceGet(MemberType.SHORT, A, B, getField());
+    builder.addInstanceGet(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IgetWide.java b/src/main/java/com/android/tools/r8/code/IgetWide.java
index e3caef5..9893911 100644
--- a/src/main/java/com/android/tools/r8/code/IgetWide.java
+++ b/src/main/java/com/android/tools/r8/code/IgetWide.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IgetWide extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstanceGet(MemberType.WIDE, A, B, getField());
+    builder.addInstanceGet(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Iput.java b/src/main/java/com/android/tools/r8/code/Iput.java
index 60aa07c..eabfb2b 100644
--- a/src/main/java/com/android/tools/r8/code/Iput.java
+++ b/src/main/java/com/android/tools/r8/code/Iput.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class Iput extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstancePut(MemberType.SINGLE, A, B, getField());
+    builder.addInstancePut(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IputBoolean.java b/src/main/java/com/android/tools/r8/code/IputBoolean.java
index 0841906..6276441 100644
--- a/src/main/java/com/android/tools/r8/code/IputBoolean.java
+++ b/src/main/java/com/android/tools/r8/code/IputBoolean.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IputBoolean extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstancePut(MemberType.BOOLEAN, A, B, getField());
+    builder.addInstancePut(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IputByte.java b/src/main/java/com/android/tools/r8/code/IputByte.java
index 1efb7f4..e333a9f 100644
--- a/src/main/java/com/android/tools/r8/code/IputByte.java
+++ b/src/main/java/com/android/tools/r8/code/IputByte.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IputByte extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstancePut(MemberType.BYTE, A, B, getField());
+    builder.addInstancePut(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IputChar.java b/src/main/java/com/android/tools/r8/code/IputChar.java
index d2c3475..f4902ee 100644
--- a/src/main/java/com/android/tools/r8/code/IputChar.java
+++ b/src/main/java/com/android/tools/r8/code/IputChar.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IputChar extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstancePut(MemberType.CHAR, A, B, getField());
+    builder.addInstancePut(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IputObject.java b/src/main/java/com/android/tools/r8/code/IputObject.java
index 3cad323..7532340 100644
--- a/src/main/java/com/android/tools/r8/code/IputObject.java
+++ b/src/main/java/com/android/tools/r8/code/IputObject.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IputObject extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstancePut(MemberType.OBJECT, A, B, getField());
+    builder.addInstancePut(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IputShort.java b/src/main/java/com/android/tools/r8/code/IputShort.java
index dcbe3aa..f0d4308 100644
--- a/src/main/java/com/android/tools/r8/code/IputShort.java
+++ b/src/main/java/com/android/tools/r8/code/IputShort.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IputShort extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstancePut(MemberType.SHORT, A, B, getField());
+    builder.addInstancePut(A, B, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IputWide.java b/src/main/java/com/android/tools/r8/code/IputWide.java
index 661d972..68d09a6 100644
--- a/src/main/java/com/android/tools/r8/code/IputWide.java
+++ b/src/main/java/com/android/tools/r8/code/IputWide.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class IputWide extends Format22c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInstancePut(MemberType.WIDE, A, B, getField());
+    builder.addInstancePut(A, B, getField());
   }
 
   @Override
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 6b75941..cd9eb78 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,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 public class MoveResult extends Format11x {
 
@@ -36,6 +35,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMoveResult(ValueType.INT_OR_FLOAT, AA);
+    builder.addMoveResult(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 a3334b8..3210b71 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,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class MoveResultObject extends Format11x {
@@ -37,6 +36,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMoveResult(ValueType.OBJECT, AA);
+    builder.addMoveResult(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 92dde3e..95b4350 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,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class MoveResultWide extends Format11x {
@@ -37,6 +36,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addMoveResult(ValueType.LONG_OR_DOUBLE, AA);
+    builder.addMoveResult(AA);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Sget.java b/src/main/java/com/android/tools/r8/code/Sget.java
index 0a0f95b..3347fdd 100644
--- a/src/main/java/com/android/tools/r8/code/Sget.java
+++ b/src/main/java/com/android/tools/r8/code/Sget.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class Sget extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticGet(MemberType.SINGLE, AA, getField());
+    builder.addStaticGet(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SgetBoolean.java b/src/main/java/com/android/tools/r8/code/SgetBoolean.java
index c28b97c..27f18f2 100644
--- a/src/main/java/com/android/tools/r8/code/SgetBoolean.java
+++ b/src/main/java/com/android/tools/r8/code/SgetBoolean.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SgetBoolean extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticGet(MemberType.BOOLEAN, AA, getField());
+    builder.addStaticGet(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SgetByte.java b/src/main/java/com/android/tools/r8/code/SgetByte.java
index 360fe32..3c0219b 100644
--- a/src/main/java/com/android/tools/r8/code/SgetByte.java
+++ b/src/main/java/com/android/tools/r8/code/SgetByte.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SgetByte extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticGet(MemberType.BYTE, AA, getField());
+    builder.addStaticGet(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SgetChar.java b/src/main/java/com/android/tools/r8/code/SgetChar.java
index 52f8fde..aa69c7f 100644
--- a/src/main/java/com/android/tools/r8/code/SgetChar.java
+++ b/src/main/java/com/android/tools/r8/code/SgetChar.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SgetChar extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticGet(MemberType.CHAR, AA, getField());
+    builder.addStaticGet(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SgetObject.java b/src/main/java/com/android/tools/r8/code/SgetObject.java
index d2bb253..f70da49 100644
--- a/src/main/java/com/android/tools/r8/code/SgetObject.java
+++ b/src/main/java/com/android/tools/r8/code/SgetObject.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SgetObject extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticGet(MemberType.OBJECT, AA, getField());
+    builder.addStaticGet(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SgetShort.java b/src/main/java/com/android/tools/r8/code/SgetShort.java
index 50ec9e4..0149fb4 100644
--- a/src/main/java/com/android/tools/r8/code/SgetShort.java
+++ b/src/main/java/com/android/tools/r8/code/SgetShort.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SgetShort extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticGet(MemberType.SHORT, AA, getField());
+    builder.addStaticGet(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SgetWide.java b/src/main/java/com/android/tools/r8/code/SgetWide.java
index 81f11a7..ea008ad 100644
--- a/src/main/java/com/android/tools/r8/code/SgetWide.java
+++ b/src/main/java/com/android/tools/r8/code/SgetWide.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SgetWide extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticGet(MemberType.WIDE, AA, getField());
+    builder.addStaticGet(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Sput.java b/src/main/java/com/android/tools/r8/code/Sput.java
index da52b63..6885da6 100644
--- a/src/main/java/com/android/tools/r8/code/Sput.java
+++ b/src/main/java/com/android/tools/r8/code/Sput.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class Sput extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticPut(MemberType.SINGLE, AA, getField());
+    builder.addStaticPut(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SputBoolean.java b/src/main/java/com/android/tools/r8/code/SputBoolean.java
index 4777e90..041ba02 100644
--- a/src/main/java/com/android/tools/r8/code/SputBoolean.java
+++ b/src/main/java/com/android/tools/r8/code/SputBoolean.java
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import static com.android.tools.r8.ir.code.MemberType.BOOLEAN;
-
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
@@ -51,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticPut(BOOLEAN, AA, getField());
+    builder.addStaticPut(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SputByte.java b/src/main/java/com/android/tools/r8/code/SputByte.java
index 803a3ea..87b79bd 100644
--- a/src/main/java/com/android/tools/r8/code/SputByte.java
+++ b/src/main/java/com/android/tools/r8/code/SputByte.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SputByte extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticPut(MemberType.BYTE, AA, getField());
+    builder.addStaticPut(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SputChar.java b/src/main/java/com/android/tools/r8/code/SputChar.java
index 23a5ff4..5fcd836 100644
--- a/src/main/java/com/android/tools/r8/code/SputChar.java
+++ b/src/main/java/com/android/tools/r8/code/SputChar.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SputChar extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticPut(MemberType.CHAR, AA, getField());
+    builder.addStaticPut(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SputObject.java b/src/main/java/com/android/tools/r8/code/SputObject.java
index 016e80d..fa661ea 100644
--- a/src/main/java/com/android/tools/r8/code/SputObject.java
+++ b/src/main/java/com/android/tools/r8/code/SputObject.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SputObject extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticPut(MemberType.OBJECT, AA, getField());
+    builder.addStaticPut(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SputShort.java b/src/main/java/com/android/tools/r8/code/SputShort.java
index 641fdaf..d2b5f85 100644
--- a/src/main/java/com/android/tools/r8/code/SputShort.java
+++ b/src/main/java/com/android/tools/r8/code/SputShort.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SputShort extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticPut(MemberType.SHORT, AA, getField());
+    builder.addStaticPut(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/SputWide.java b/src/main/java/com/android/tools/r8/code/SputWide.java
index d9a743b..7e6aeaa 100644
--- a/src/main/java/com/android/tools/r8/code/SputWide.java
+++ b/src/main/java/com/android/tools/r8/code/SputWide.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 public class SputWide extends Format21c {
@@ -50,7 +49,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addStaticPut(MemberType.WIDE, AA, getField());
+    builder.addStaticPut(AA, getField());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexType.java b/src/main/java/com/android/tools/r8/graph/DexType.java
index 7aab880..5aaf308 100644
--- a/src/main/java/com/android/tools/r8/graph/DexType.java
+++ b/src/main/java/com/android/tools/r8/graph/DexType.java
@@ -303,6 +303,10 @@
     return (char) descriptor.content[0] == 'V';
   }
 
+  public boolean isBooleanType() {
+    return descriptor.content[0] == 'Z';
+  }
+
   public boolean isArrayType() {
     char firstChar = (char) descriptor.content[0];
     return firstChar == '[';
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 48dc873..2b00623 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,6 @@
 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.ValueType;
 import com.android.tools.r8.ir.code.Instruction;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.utils.EncodedValueUtils;
@@ -232,9 +231,7 @@
 
     @Override
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
-      return (this == DEFAULT && hasClassInitializer)
-          ? null
-          : new ConstNumber(ValueType.INT, dest, value);
+      return (this == DEFAULT && hasClassInitializer) ? null : new ConstNumber(dest, value);
     }
   }
 
@@ -280,9 +277,7 @@
 
     @Override
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
-      return (this == DEFAULT && hasClassInitializer)
-          ? null
-          : new ConstNumber(ValueType.INT, dest, value);
+      return (this == DEFAULT && hasClassInitializer) ? null : new ConstNumber(dest, value);
     }
   }
 
@@ -332,9 +327,7 @@
 
     @Override
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
-      return (this == DEFAULT && hasClassInitializer)
-          ? null
-          : new ConstNumber(ValueType.INT, dest, value);
+      return (this == DEFAULT && hasClassInitializer) ? null : new ConstNumber(dest, value);
     }
   }
 
@@ -380,9 +373,7 @@
 
     @Override
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
-      return (this == DEFAULT && hasClassInitializer)
-          ? null
-          : new ConstNumber(ValueType.INT, dest, value);
+      return (this == DEFAULT && hasClassInitializer) ? null : new ConstNumber(dest, value);
     }
   }
 
@@ -428,9 +419,7 @@
 
     @Override
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
-      return (this == DEFAULT && hasClassInitializer)
-          ? null
-          : new ConstNumber(ValueType.LONG, dest, value);
+      return (this == DEFAULT && hasClassInitializer) ? null : new ConstNumber(dest, value);
     }
   }
 
@@ -867,9 +856,7 @@
 
     @Override
     public Instruction asConstInstruction(boolean hasClassInitializer, Value dest) {
-      return (this == DEFAULT && hasClassInitializer)
-          ? null
-          : new ConstNumber(ValueType.INT, dest, value ? 1 : 0);
+      return (this == DEFAULT && hasClassInitializer) ? null : new ConstNumber(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 957c092..14a2a98 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
@@ -61,26 +61,26 @@
       int right = rightValue().getConstInstruction().asConstNumber().getIntValue();
       int result = foldIntegers(left, right);
       Value value = code.createValue(ValueType.INT, getLocalInfo());
-      return new ConstNumber(ValueType.INT, value, result);
+      return new ConstNumber(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(ValueType.LONG, getLocalInfo());
-      return new ConstNumber(ValueType.LONG, value, result);
+      return new ConstNumber(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(ValueType.FLOAT, getLocalInfo());
-      return new ConstNumber(ValueType.FLOAT, value, Float.floatToIntBits(result));
+      return new ConstNumber(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(ValueType.DOUBLE, getLocalInfo());
-      return new ConstNumber(ValueType.DOUBLE, value, Double.doubleToLongBits(result));
+      return new ConstNumber(value, Double.doubleToLongBits(result));
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index ee1db81..e0aa965 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -47,10 +47,14 @@
     int index = builder.allocatedRegister(index(), getNumber());
     com.android.tools.r8.code.Instruction instruction;
     switch (type) {
-      case SINGLE:
+      case INT:
+      case FLOAT:
+      case INT_OR_FLOAT:
         instruction = new Aget(dest, array, index);
         break;
-      case WIDE:
+      case LONG:
+      case DOUBLE:
+      case LONG_OR_DOUBLE:
         instruction = new AgetWide(dest, array, index);
         break;
       case OBJECT:
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
index 32b03f4..55b71ec 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -49,10 +49,14 @@
     int index = builder.allocatedRegister(index(), getNumber());
     com.android.tools.r8.code.Instruction instruction;
     switch (type) {
-      case SINGLE:
+      case INT:
+      case FLOAT:
+      case INT_OR_FLOAT:
         instruction = new Aput(source, array, index);
         break;
-      case WIDE:
+      case LONG:
+      case DOUBLE:
+      case LONG_OR_DOUBLE:
         instruction = new AputWide(source, array, index);
         break;
       case OBJECT:
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 a39e268..dc77691 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
@@ -181,7 +181,7 @@
     }
     assert result == -1 || result == 0 || result == 1;
     Value value = code.createValue(ValueType.INT, getLocalInfo());
-    return new ConstNumber(ValueType.INT, value, result);
+    return new ConstNumber(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 fa49996..ba5c27f 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
@@ -20,27 +20,25 @@
 
 public class ConstNumber extends ConstInstruction {
 
-  public final ValueType type;
   private final long value;
 
-  public ConstNumber(ValueType type, Value dest, long value) {
+  public ConstNumber(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
     // const number instructions should be marked as constants.
     assert dest.isFixedRegisterValue() || dest.definition.isConstNumber();
-    this.type = type;
     this.value = value;
   }
 
   public static ConstNumber copyOf(IRCode code, ConstNumber original) {
     Value newValue =
         new Value(code.valueNumberGenerator.next(), original.outType(), original.getLocalInfo());
-    return new ConstNumber(original.type, newValue, original.getRawValue());
+    return new ConstNumber(newValue, original.getRawValue());
   }
 
   private boolean preciseTypeUnknown() {
-    return type == ValueType.INT_OR_FLOAT || type == ValueType.LONG_OR_DOUBLE;
+    return outType() == ValueType.INT_OR_FLOAT || outType() == ValueType.LONG_OR_DOUBLE;
   }
 
   public Value dest() {
@@ -52,22 +50,24 @@
   }
 
   public int getIntValue() {
-    assert type == ValueType.INT || type == ValueType.INT_OR_FLOAT || type == ValueType.OBJECT;
+    assert outType() == ValueType.INT
+        || outType() == ValueType.INT_OR_FLOAT
+        || outType() == ValueType.OBJECT;
     return (int) value;
   }
 
   public long getLongValue() {
-    assert type == ValueType.LONG || type == ValueType.LONG_OR_DOUBLE;
+    assert outType() == ValueType.LONG || outType() == ValueType.LONG_OR_DOUBLE;
     return value;
   }
 
   public float getFloatValue() {
-    assert type == ValueType.FLOAT || type == ValueType.INT_OR_FLOAT;
+    assert outType() == ValueType.FLOAT || outType() == ValueType.INT_OR_FLOAT;
     return Float.intBitsToFloat((int) value);
   }
 
   public double getDoubleValue() {
-    assert type == ValueType.DOUBLE || type == ValueType.LONG_OR_DOUBLE;
+    assert outType() == ValueType.DOUBLE || outType() == ValueType.LONG_OR_DOUBLE;
     return Double.longBitsToDouble(value);
   }
 
@@ -80,11 +80,11 @@
   }
 
   public boolean isIntegerZero() {
-    return type == ValueType.INT && getIntValue() == 0;
+    return outType() == ValueType.INT && getIntValue() == 0;
   }
 
   public boolean isIntegerOne() {
-    return type == ValueType.INT && getIntValue() == 1;
+    return outType() == ValueType.INT && getIntValue() == 1;
   }
 
   public boolean isIntegerNegativeOne(NumericType type) {
@@ -104,7 +104,7 @@
     }
 
     int register = builder.allocatedRegister(dest(), getNumber());
-    if (type.isSingle() || type.isObject()) {
+    if (outType().isSingle() || outType().isObject()) {
       assert NumberUtils.is32Bit(value);
       if ((register & 0xf) == register && NumberUtils.is4Bit(value)) {
         builder.add(this, new Const4(register, (int) value));
@@ -116,7 +116,7 @@
         builder.add(this, new Const(register, (int) value));
       }
     } else {
-      assert type.isWide();
+      assert outType().isWide();
       if (NumberUtils.is16Bit(value)) {
         builder.add(this, new ConstWide16(register, (int) value));
       } else if ((value & 0x0000ffffffffffffL) == 0) {
@@ -179,7 +179,7 @@
 
   @Override
   public String toString() {
-    return super.toString() + " " + value + " (" + type + ")";
+    return super.toString() + " " + value + " (" + outType() + ")";
   }
 
   @Override
@@ -188,14 +188,14 @@
       return false;
     }
     ConstNumber o = other.asConstNumber();
-    return o.type == type && o.value == value;
+    return o.outType() == outType() && o.value == value;
   }
 
   @Override
   public int compareNonValueParts(Instruction other) {
     ConstNumber o = other.asConstNumber();
     int result;
-    result = type.ordinal() - o.type.ordinal();
+    result = outType().ordinal() - o.outType().ordinal();
     if (result != 0) {
       return result;
     }
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 fb86708..565204f 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(ValueType type, Value value) {
-    super(type == ValueType.OBJECT ? ValueType.INT : type, value, 0);
+  public DebugLocalUninitialized(Value value) {
+    super(value, 0);
   }
 
   @Override
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 490370e..95dd4ba 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
@@ -482,15 +482,15 @@
   }
 
   public ConstNumber createIntConstant(int value) {
-    return new ConstNumber(ValueType.INT, createValue(ValueType.INT), value);
+    return new ConstNumber(createValue(ValueType.INT), value);
   }
 
   public ConstNumber createTrue() {
-    return new ConstNumber(ValueType.INT, createValue(ValueType.INT), 1);
+    return new ConstNumber(createValue(ValueType.INT), 1);
   }
 
   public ConstNumber createFalse() {
-    return new ConstNumber(ValueType.INT, createValue(ValueType.INT), 0);
+    return new ConstNumber(createValue(ValueType.INT), 0);
   }
 
   public final int getHighestBlockNumber() {
@@ -498,8 +498,7 @@
   }
 
   public Instruction createConstNull(Instruction from) {
-    Value newValue = createValue(from.outType());
-    return new ConstNumber(from.outType(), newValue, 0);
+    return new ConstNumber(createValue(from.outType()), 0);
   }
 
   public boolean doAllThrowingInstructionsHavePositions() {
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
index bebbea1..e1bc063 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
@@ -40,10 +40,14 @@
     int objectRegister = builder.allocatedRegister(object(), getNumber());
     com.android.tools.r8.code.Instruction instruction;
     switch (type) {
-      case SINGLE:
+      case INT:
+      case FLOAT:
+      case INT_OR_FLOAT:
         instruction = new Iget(destRegister, objectRegister, field);
         break;
-      case WIDE:
+      case LONG:
+      case DOUBLE:
+      case LONG_OR_DOUBLE:
         instruction = new IgetWide(destRegister, objectRegister, field);
         break;
       case OBJECT:
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
index 25cb64b..eae9e68 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
@@ -40,10 +40,14 @@
     int valueRegister = builder.allocatedRegister(value(), getNumber());
     int objectRegister = builder.allocatedRegister(object(), getNumber());
     switch (type) {
-      case SINGLE:
+      case INT:
+      case FLOAT:
+      case INT_OR_FLOAT:
         instruction = new Iput(valueRegister, objectRegister, field);
         break;
-      case WIDE:
+      case LONG:
+      case DOUBLE:
+      case LONG_OR_DOUBLE:
         instruction = new IputWide(valueRegister, objectRegister, field);
         break;
       case OBJECT:
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 e33cce9..ba10ed5 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
@@ -79,6 +79,8 @@
 
   abstract public Type getType();
 
+  abstract public DexType getReturnType();
+
   public List<Value> arguments() {
     return inValues;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
index adbb602..9db800a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -22,6 +22,11 @@
     this.callSite = callSite;
   }
 
+  @Override
+  public DexType getReturnType() {
+    return callSite.methodProto.returnType;
+  }
+
   public DexCallSite getCallSite() {
     return callSite;
   }
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 ff4d876..0fd4804 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
@@ -24,6 +24,11 @@
     this.method = target;
   }
 
+  @Override
+  public DexType getReturnType() {
+    return method.proto.returnType;
+  }
+
   public DexMethod getInvokedMethod() {
     return method;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index 5251e20..17f06e7 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -21,6 +21,11 @@
     this.type = type;
   }
 
+  @Override
+  public DexType getReturnType() {
+    return getArrayType();
+  }
+
   public DexType getArrayType() {
     return type;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
index 126bfd2..4b35d87 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProto;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.conversion.DexBuilder;
 import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
 import com.android.tools.r8.ir.optimize.InliningOracle;
@@ -24,6 +25,11 @@
   }
 
   @Override
+  public DexType getReturnType() {
+    return proto.returnType;
+  }
+
+  @Override
   public Type getType() {
     return Type.POLYMORPHIC;
   }
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 2481025..5b19aab 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
@@ -38,7 +38,7 @@
       int right = rightValue().getConstInstruction().asConstNumber().getIntValue();
       int result = foldIntegers(left, right);
       Value value = code.createValue(ValueType.INT, getLocalInfo());
-      return new ConstNumber(ValueType.INT, value, result);
+      return new ConstNumber(value, result);
     } else {
       assert type == NumericType.LONG;
       long left = leftValue().getConstInstruction().asConstNumber().getLongValue();
@@ -51,7 +51,7 @@
       }
       long result = foldLongs(left, right);
       Value value = code.createValue(ValueType.LONG, getLocalInfo());
-      return new ConstNumber(ValueType.LONG, value, result);
+      return new ConstNumber(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 28ae7ac..fc50049 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
@@ -9,50 +9,39 @@
 import com.android.tools.r8.graph.DexType;
 
 public enum MemberType {
-  SINGLE,
-  WIDE,
   OBJECT,
   BOOLEAN,
   BYTE,
   CHAR,
-  SHORT;
-
-  public static ValueType moveTypeFor(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;
-    }
-    return null;
-  }
+  SHORT,
+  INT,
+  FLOAT,
+  LONG,
+  DOUBLE,
+  INT_OR_FLOAT,
+  LONG_OR_DOUBLE;
 
   public static MemberType fromTypeDescriptorChar(char descriptor) {
     switch (descriptor) {
-      case 'L':  // object
-      case '[':  // array
+      case 'L':
+      case '[':
         return MemberType.OBJECT;
-      case 'Z':  // boolean
+      case 'Z':
         return MemberType.BOOLEAN;
-      case 'B':  // byte
+      case 'B':
         return MemberType.BYTE;
-      case 'S':  // short
+      case 'S':
         return MemberType.SHORT;
-      case 'C':  // char
+      case 'C':
         return MemberType.CHAR;
-      case 'I':  // int
-      case 'F':  // float
-        return MemberType.SINGLE;
-      case 'J':  // long
-      case 'D':  // double
-        return MemberType.WIDE;
+      case 'I':
+        return MemberType.INT;
+      case 'F':
+        return MemberType.FLOAT;
+      case 'J':
+        return MemberType.LONG;
+      case 'D':
+        return MemberType.DOUBLE;
       case 'V':
         throw new InternalCompilerError("No member type for void type.");
       default:
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 9fb215f..5dfe0e7 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
@@ -33,20 +33,20 @@
     if (type == NumericType.INT) {
       int result = -source().getConstInstruction().asConstNumber().getIntValue();
       Value value = code.createValue(valueType, getLocalInfo());
-      return new ConstNumber(valueType, value, result);
+      return new ConstNumber(value, result);
     } else if (type == NumericType.LONG) {
       long result = -source().getConstInstruction().asConstNumber().getLongValue();
       Value value = code.createValue(valueType, getLocalInfo());
-      return new ConstNumber(valueType, value, result);
+      return new ConstNumber(value, result);
     } else if (type == NumericType.FLOAT) {
       float result = -source().getConstInstruction().asConstNumber().getFloatValue();
       Value value = code.createValue(valueType, getLocalInfo());
-      return new ConstNumber(valueType, value, Float.floatToIntBits(result));
+      return new ConstNumber(value, Float.floatToIntBits(result));
     } else {
       assert type == NumericType.DOUBLE;
       double result = -source().getConstInstruction().asConstNumber().getDoubleValue();
       Value value = code.createValue(valueType, getLocalInfo());
-      return new ConstNumber(valueType, value, Double.doubleToLongBits(result));
+      return new ConstNumber(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 ec941c0..3333845 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
@@ -29,12 +29,12 @@
     if (type == NumericType.INT) {
       int result = ~(source().getConstInstruction().asConstNumber().getIntValue());
       Value value = code.createValue(valueType, getLocalInfo());
-      return new ConstNumber(valueType, value, result);
+      return new ConstNumber(value, result);
     } else {
       assert type == NumericType.LONG;
       long result = ~source().getConstInstruction().asConstNumber().getLongValue();
       Value value = code.createValue(valueType, getLocalInfo());
-      return new ConstNumber(valueType, value, result);
+      return new ConstNumber(value, result);
     }
   }
 
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 af91d29..23069f2 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
@@ -36,10 +36,14 @@
     com.android.tools.r8.code.Instruction instruction;
     int dest = builder.allocatedRegister(dest(), getNumber());
     switch (type) {
-      case SINGLE:
+      case INT:
+      case FLOAT:
+      case INT_OR_FLOAT:
         instruction = new Sget(dest, field);
         break;
-      case WIDE:
+      case LONG:
+      case DOUBLE:
+      case LONG_OR_DOUBLE:
         instruction = new SgetWide(dest, field);
         break;
       case OBJECT:
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
index 8a55361..fb3ab18 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -34,10 +34,14 @@
     com.android.tools.r8.code.Instruction instruction;
     int src = builder.allocatedRegister(inValue(), getNumber());
     switch (type) {
-      case SINGLE:
+      case INT:
+      case FLOAT:
+      case INT_OR_FLOAT:
         instruction = new Sput(src, field);
         break;
-      case WIDE:
+      case LONG:
+      case DOUBLE:
+      case LONG_OR_DOUBLE:
         instruction = new SputWide(src, field);
         break;
       case OBJECT:
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
index 231a82f..dd058f0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ValueType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ValueType.java
@@ -45,10 +45,17 @@
       case BYTE:
       case CHAR:
       case SHORT:
+      case INT:
         return ValueType.INT;
-      case SINGLE:
+      case FLOAT:
+        return ValueType.FLOAT;
+      case INT_OR_FLOAT:
         return ValueType.INT_OR_FLOAT;
-      case WIDE:
+      case LONG:
+        return ValueType.LONG;
+      case DOUBLE:
+        return ValueType.DOUBLE;
+      case LONG_OR_DOUBLE:
         return ValueType.LONG_OR_DOUBLE;
       case OBJECT:
         return ValueType.OBJECT;
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 68c3f08..e8e689c 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
@@ -587,7 +587,7 @@
     }
     Value value = writeRegister(register, type, ThrowingInfo.NO_THROW, null);
     assert !value.hasLocalInfo();
-    addInstruction(new DebugLocalUninitialized(type, value));
+    addInstruction(new DebugLocalUninitialized(value));
   }
 
   private void addDebugLocalWrite(ValueType type, int dest, Value in) {
@@ -778,7 +778,7 @@
 
   public void addConst(ValueType type, int dest, long value) {
     Value out = writeRegister(dest, type, ThrowingInfo.NO_THROW);
-    ConstNumber instruction = new ConstNumber(type, out, value);
+    ConstNumber instruction = new ConstNumber(out, value);
     assert !instruction.instructionTypeCanThrow();
     add(instruction);
   }
@@ -793,7 +793,7 @@
       currentBlock.writeCurrentDefinition(dest, existing.outValue(), ThrowingInfo.NO_THROW);
     } else {
       Value out = writeRegister(dest, type, ThrowingInfo.NO_THROW);
-      ConstNumber instruction = new ConstNumber(type, out, value);
+      ConstNumber instruction = new ConstNumber(out, value);
       BasicBlock entryBlock = blocks.get(0);
       if (currentBlock != entryBlock) {
         // Insert the constant instruction at the start of the block right after the argument
@@ -1020,11 +1020,8 @@
     }
   }
 
-  public void addInstanceGet(
-      MemberType type,
-      int dest,
-      int object,
-      DexField field) {
+  public void addInstanceGet(int dest, int object, DexField field) {
+    MemberType type = MemberType.fromDexType(field.type);
     Value in = readRegister(object, ValueType.OBJECT);
     Value out = writeRegister(dest, ValueType.fromMemberType(type), ThrowingInfo.CAN_THROW);
     out.setKnownToBeBoolean(type == MemberType.BOOLEAN);
@@ -1041,11 +1038,8 @@
     addInstruction(instruction);
   }
 
-  public void addInstancePut(
-      MemberType type,
-      int value,
-      int object,
-      DexField field) {
+  public void addInstancePut(int value, int object, DexField field) {
+    MemberType type = MemberType.fromDexType(field.type);
     List<Value> values = new ArrayList<>(2);
     values.add(readRegister(value, ValueType.fromMemberType(type)));
     values.add(readRegister(object, ValueType.OBJECT));
@@ -1274,21 +1268,14 @@
     addInstruction(instruction);
   }
 
-  public void addMoveResult(ValueType type, int dest) {
+  public void addMoveResult(int dest) {
     List<Instruction> instructions = currentBlock.getInstructions();
     Invoke invoke = instructions.get(instructions.size() - 1).asInvoke();
     assert invoke.outValue() == null;
     assert invoke.instructionTypeCanThrow();
-    invoke.setOutValue(writeRegister(dest, type, ThrowingInfo.CAN_THROW));
-  }
-
-  public void addBooleanMoveResult(ValueType type, int dest) {
-    List<Instruction> instructions = currentBlock.getInstructions();
-    Invoke invoke = instructions.get(instructions.size() - 1).asInvoke();
-    assert invoke.outValue() == null;
-    assert invoke.instructionTypeCanThrow();
-    Value outValue = writeRegister(dest, type, ThrowingInfo.CAN_THROW);
-    outValue.setKnownToBeBoolean(true);
+    DexType outType = invoke.getReturnType();
+    Value outValue = writeRegister(dest, ValueType.fromDexType(outType), ThrowingInfo.CAN_THROW);
+    outValue.setKnownToBeBoolean(outType.isBooleanType());
     invoke.setOutValue(outValue);
   }
 
@@ -1345,7 +1332,8 @@
     closeCurrentBlock();
   }
 
-  public void addStaticGet(MemberType type, int dest, DexField field) {
+  public void addStaticGet(int dest, DexField field) {
+    MemberType type = MemberType.fromDexType(field.type);
     Value out = writeRegister(dest, ValueType.fromMemberType(type), ThrowingInfo.CAN_THROW);
     out.setKnownToBeBoolean(type == MemberType.BOOLEAN);
     StaticGet instruction = new StaticGet(type, out, field);
@@ -1353,7 +1341,8 @@
     addInstruction(instruction);
   }
 
-  public void addStaticPut(MemberType type, int value, DexField field) {
+  public void addStaticPut(int value, DexField field) {
+    MemberType type = MemberType.fromDexType(field.type);
     Value in = readRegister(value, ValueType.fromMemberType(type));
     add(new StaticPut(type, in, field));
   }
@@ -1660,7 +1649,7 @@
 
   public Value readLiteral(NumericType type, long constant) {
     Value value = new Value(valueNumberGenerator.next(), ValueType.fromNumericType(type), null);
-    add(new ConstNumber(ValueType.fromNumericType(type), value, constant));
+    add(new ConstNumber(value, constant));
     return value;
   }
 
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 c966690..3c102c1 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
@@ -251,31 +251,43 @@
     // Initialize all non-argument locals to ensure safe insertion of debug-local instructions.
     for (Object o : node.localVariables) {
       LocalVariableNode local = (LocalVariableNode) o;
-      Type localType = Type.getType(local.desc);
-      int sort = localType.getSort();
-      switch (sort) {
+      Type localType;
+      ValueType localValueType;
+      switch (Type.getType(local.desc).getSort()) {
         case Type.OBJECT:
-        case Type.ARRAY:
+        case Type.ARRAY: {
           localType = JarState.NULL_TYPE;
+          localValueType = ValueType.OBJECT;
           break;
-        case Type.DOUBLE:
+        }
         case Type.LONG:
-        case Type.FLOAT:
+        case Type.DOUBLE: {
+          localType = Type.LONG_TYPE;
+          localValueType = ValueType.LONG_OR_DOUBLE;
           break;
+        }
+        case Type.BOOLEAN:
+        case Type.CHAR:
+        case Type.BYTE:
+        case Type.SHORT:
+        case Type.INT:
+        case Type.FLOAT: {
+          localType = Type.INT_TYPE;
+          localValueType = ValueType.INT_OR_FLOAT;
+          break;
+        }
         case Type.VOID:
         case Type.METHOD:
-          throw new Unreachable("Invalid local variable type: " + localType);
         default:
-          localType = Type.INT_TYPE;
-          break;
+          throw new Unreachable("Invalid local variable type: " );
       }
       int localRegister = state.getLocalRegister(local.index, 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;
+        // For uninitialized entries write the local to ensure it exists in the local state.
+        int writeRegister = state.writeLocal(local.index, localType);
+        assert writeRegister == localRegister;
         initializedLocals.put(localRegister, localValueType);
         uninitializedLocals.put(localRegister, localValueType);
       }
@@ -842,11 +854,13 @@
       case Type.CHAR:
         return MemberType.CHAR;
       case Type.INT:
+        return MemberType.INT;
       case Type.FLOAT:
-        return MemberType.SINGLE;
+        return MemberType.FLOAT;
       case Type.LONG:
+        return MemberType.LONG;
       case Type.DOUBLE:
-        return MemberType.WIDE;
+        return MemberType.DOUBLE;
       case Type.VOID:
         // Illegal. Throws in fallthrough.
       default:
@@ -2438,24 +2452,23 @@
   private void build(FieldInsnNode insn, IRBuilder builder) {
     DexField field = application.getField(insn.owner, insn.name, insn.desc);
     Type type = Type.getType(insn.desc);
-    MemberType fieldType = memberType(insn.desc);
     switch (insn.getOpcode()) {
       case Opcodes.GETSTATIC:
-        builder.addStaticGet(fieldType, state.push(type), field);
+        builder.addStaticGet(state.push(type), field);
         break;
       case Opcodes.PUTSTATIC:
-        builder.addStaticPut(fieldType, state.pop(type).register, field);
+        builder.addStaticPut(state.pop(type).register, field);
         break;
       case Opcodes.GETFIELD: {
         Slot object = state.pop(JarState.OBJECT_TYPE);
         int dest = state.push(type);
-        builder.addInstanceGet(fieldType, dest, object.register, field);
+        builder.addInstanceGet(dest, object.register, field);
         break;
       }
       case Opcodes.PUTFIELD: {
         Slot value = state.pop(type);
         Slot object = state.pop(JarState.OBJECT_TYPE);
-        builder.addInstancePut(fieldType, value.register, object.register, field);
+        builder.addInstancePut(value.register, object.register, field);
         break;
       }
       default:
@@ -2516,11 +2529,7 @@
     // Move the result to the "top of stack".
     Type returnType = Type.getReturnType(methodDesc);
     if (returnType != Type.VOID_TYPE) {
-      if (returnType == Type.BOOLEAN_TYPE) {
-        builder.addBooleanMoveResult(valueType(returnType), state.push(returnType));
-      } else {
-        builder.addMoveResult(valueType(returnType), state.push(returnType));
-      }
+      builder.addMoveResult(state.push(returnType));
     }
   }
 
@@ -2765,7 +2774,7 @@
     }
     builder.addInvokeNewArray(dimArrayType, insn.dims, dimensions);
     int dimensionsDestTemp = state.push(INT_ARRAY_TYPE);
-    builder.addMoveResult(ValueType.OBJECT, dimensionsDestTemp);
+    builder.addMoveResult(dimensionsDestTemp);
     // Push the class object for the member type of the array.
     int classDestTemp = state.push(CLASS_TYPE);
     builder.ensureBlockForThrowingInstruction();
@@ -2782,7 +2791,7 @@
     state.pop(); // classDestTemp.
     state.pop(); // dimensionsDestTemp.
     int result = state.push(arrayType);
-    builder.addMoveResult(valueType(arrayType), result);
+    builder.addMoveResult(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 551d629..56c3b9f 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
@@ -119,7 +119,7 @@
     } else {
       ValueType valueType = ValueType.fromDexType(proto.returnType);
       int tempValue = nextRegister(valueType);
-      add(builder -> builder.addMoveResult(valueType, tempValue));
+      add(builder -> builder.addMoveResult(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 20286a8..3fc6f67 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
@@ -53,7 +53,7 @@
     } else {
       ValueType valueType = ValueType.fromDexType(proto.returnType);
       int tempValue = nextRegister(valueType);
-      add(builder -> builder.addMoveResult(valueType, tempValue));
+      add(builder -> builder.addMoveResult(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 ea891ea..8e69359 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
@@ -5,7 +5,6 @@
 package com.android.tools.r8.ir.desugar;
 
 import com.android.tools.r8.ir.code.Invoke;
-import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import java.util.Collections;
@@ -29,7 +28,7 @@
         Collections.singletonList(ValueType.OBJECT), Collections.singletonList(instance)));
 
     // Assign to a field.
-    add(builder -> builder.addStaticPut(MemberType.OBJECT, instance, lambda.instanceField));
+    add(builder -> builder.addStaticPut(instance, lambda.instanceField));
 
     // Final return.
     add(IRBuilder::addReturn);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaConstructorSourceCode.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaConstructorSourceCode.java
index b736403..3e268b8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaConstructorSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaConstructorSourceCode.java
@@ -8,7 +8,6 @@
 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.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import java.util.Collections;
 
@@ -31,11 +30,9 @@
     int capturedValues = capturedTypes.length;
     if (capturedValues > 0) {
       for (int i = 0; i < capturedValues; i++) {
-        MemberType memberType = MemberType.fromDexType(capturedTypes[i]);
         DexField field = lambda.getCaptureField(i);
         int idx = i;
-        add(builder -> builder.addInstancePut(memberType,
-            getParamRegister(idx), getReceiverRegister(), field));
+        add(builder -> builder.addInstancePut(getParamRegister(idx), getReceiverRegister(), field));
       }
     }
 
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 40911e5..5f1109b 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
@@ -12,7 +12,6 @@
 import com.android.tools.r8.graph.DexString;
 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.NumericType;
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
@@ -227,8 +226,7 @@
     // Load captures if needed.
     int capturedValues = capturedTypes.length;
     for (int i = 0; i < capturedValues; i++) {
-      MemberType memberType = MemberType.fromDexType(capturedTypes[i]);
-      ValueType valueType = MemberType.moveTypeFor(memberType);
+      ValueType valueType = ValueType.fromDexType(capturedTypes[i]);
       int register = nextRegister(valueType);
 
       argValueTypes.add(valueType);
@@ -236,8 +234,7 @@
 
       // Read field into tmp local.
       DexField field = lambda.getCaptureField(i);
-      add(builder -> builder.addInstanceGet(
-          memberType, register, getReceiverRegister(), field));
+      add(builder -> builder.addInstanceGet(register, getReceiverRegister(), field));
     }
 
     // Prepare arguments.
@@ -265,7 +262,7 @@
     } else {
       ValueType implValueType = ValueType.fromDexType(implReturnType);
       int tempValue = nextRegister(implValueType);
-      add(builder -> builder.addMoveResult(implValueType, tempValue));
+      add(builder -> builder.addMoveResult(tempValue));
       int adjustedValue = prepareReturnValue(tempValue,
           erasedReturnType, enforcedReturnType, methodToCall.proto.returnType);
       ValueType adjustedValueType = ValueType.fromDexType(erasedReturnType);
@@ -469,7 +466,7 @@
 
     ValueType valueType = ValueType.fromDexType(primitiveType);
     int result = nextRegister(valueType);
-    add(builder -> builder.addMoveResult(valueType, result));
+    add(builder -> builder.addMoveResult(result));
     return result;
   }
 
@@ -491,7 +488,7 @@
         method, method.proto, argValueTypes, argRegisters));
 
     int result = nextRegister(ValueType.OBJECT);
-    add(builder -> builder.addMoveResult(ValueType.OBJECT, result));
+    add(builder -> builder.addMoveResult(result));
     return result;
   }
 }
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 bad56c1..8f09aaa 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
@@ -75,11 +75,12 @@
     if (rule != null && rule.hasReturnValue() && rule.getReturnValue().isSingleValue()) {
       assert valueType != ValueType.OBJECT;
       Value value = code.createValue(valueType, instruction.getLocalInfo());
-      replacement = new ConstNumber(valueType, value, rule.getReturnValue().getSingleValue());
+      replacement = new ConstNumber(value, rule.getReturnValue().getSingleValue());
     }
     if (replacement == null &&
         rule != null && rule.hasReturnValue() && rule.getReturnValue().isField()) {
       DexField field = rule.getReturnValue().getField();
+      assert ValueType.fromDexType(field.type) == valueType;
       DexEncodedField staticField = appInfo.lookupStaticTarget(field.clazz, field);
       if (staticField != null) {
         Value value = code.createValue(valueType, instruction.getLocalInfo());
@@ -165,8 +166,7 @@
               long constant = target.getOptimizationInfo().getReturnedConstant();
               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(valueType, value, constant);
+              Instruction knownConstReturn = new ConstNumber(value, constant);
               invoke.outValue().replaceUsers(value);
               knownConstReturn.setPosition(invoke.getPosition());
               iterator.add(knownConstReturn);
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 49b46dd..2b96878 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
@@ -136,7 +136,7 @@
         instruction = new Move(to, from);
       } else {
         ConstNumber number = move.definition.asConstNumber();
-        instruction = new ConstNumber(number.type, to, number.getRawValue());
+        instruction = new ConstNumber(to, number.getRawValue());
       }
     } else {
       Value from = new FixedRegisterValue(move.type, valueMap.get(move.src));
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 43e55ac..4c59686 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
@@ -98,7 +98,7 @@
     } else {
       ValueType valueType = ValueType.fromDexType(proto.returnType);
       int tempValue = nextRegister(valueType);
-      add(builder -> builder.addMoveResult(valueType, tempValue));
+      add(builder -> builder.addMoveResult(tempValue));
       add(builder -> builder.addReturn(valueType, tempValue));
     }
   }
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 0b7dafb..5165432 100644
--- a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
+++ b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
@@ -367,7 +367,7 @@
       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(ValueType.INT, newConstValue, 10);
+      Instruction constInstruction = new ConstNumber(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 726d6b1..2ea44eb 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
@@ -47,11 +47,11 @@
   public void equalityOfConstantOperands() {
     RegisterAllocator allocator = new MockRegisterAllocator();
     Value value0 = new Value(0, ValueType.INT, null);
-    ConstNumber const0 = new ConstNumber(ValueType.INT, value0, 0);
+    ConstNumber const0 = new ConstNumber(value0, 0);
     Value value1 = new Value(1, ValueType.INT, null);
-    ConstNumber const1 = new ConstNumber(ValueType.INT, value1, 1);
+    ConstNumber const1 = new ConstNumber(value1, 1);
     Value value2 = new Value(2, ValueType.INT, null);
-    ConstNumber const2 = new ConstNumber(ValueType.INT, value2, 2);
+    ConstNumber const2 = new ConstNumber(value2, 2);
     Value value3 = new Value(2, ValueType.INT, null);
     Add add0 = new Add(NumericType.INT, value3, value0, value1);
     add0.setPosition(Position.none());