diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeLatticeElement.java
index abcdb9e..07e3503 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class BooleanTypeLatticeElement extends PrimitiveTypeLatticeElement {
+public class BooleanTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
+
   private static final BooleanTypeLatticeElement INSTANCE = new BooleanTypeLatticeElement();
 
   static BooleanTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeLatticeElement.java
index d05c25e..b2df89c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class ByteTypeLatticeElement extends PrimitiveTypeLatticeElement {
+public class ByteTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
+
   private static final ByteTypeLatticeElement INSTANCE = new ByteTypeLatticeElement();
 
   static ByteTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeLatticeElement.java
index 27834aa..3ff532f 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class CharTypeLatticeElement extends PrimitiveTypeLatticeElement {
+public class CharTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
+
   private static final CharTypeLatticeElement INSTANCE = new CharTypeLatticeElement();
 
   static CharTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeLatticeElement.java
index 06b7e8c..3f521c2 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class DoubleTypeLatticeElement extends WideTypeLatticeElement {
+public class DoubleTypeLatticeElement extends WidePrimitiveTypeLatticeElement {
+
   private static final DoubleTypeLatticeElement INSTANCE = new DoubleTypeLatticeElement();
 
   static DoubleTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeLatticeElement.java
index fa363ea..69933a0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeLatticeElement.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class FloatTypeLatticeElement extends SingleTypeLatticeElement {
+public class FloatTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
   private static final FloatTypeLatticeElement INSTANCE = new FloatTypeLatticeElement();
 
   static FloatTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeLatticeElement.java
index 7e295c1..2d7e5b3 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeLatticeElement.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class IntTypeLatticeElement extends SingleTypeLatticeElement {
+public class IntTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
   private static final IntTypeLatticeElement INSTANCE = new IntTypeLatticeElement();
 
   static IntTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeLatticeElement.java
index 71d7299..db3ef45 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class LongTypeLatticeElement extends WideTypeLatticeElement {
+public class LongTypeLatticeElement extends WidePrimitiveTypeLatticeElement {
+
   private static final LongTypeLatticeElement INSTANCE = new LongTypeLatticeElement();
 
   static LongTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeLatticeElement.java
index 569c903..f43ebab 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeLatticeElement.java
@@ -133,18 +133,18 @@
     if (this == other) {
       return this;
     }
-    if (isSingle()) {
-      if (other.isSingle()) {
+    if (isSinglePrimitive()) {
+      if (other.isSinglePrimitive()) {
         return TypeLatticeElement.SINGLE;
       }
-      assert other.isWide();
+      assert other.isWidePrimitive();
       return TypeLatticeElement.TOP;
     }
-    assert isWide();
-    if (other.isWide()) {
+    assert isWidePrimitive();
+    if (other.isWidePrimitive()) {
       return TypeLatticeElement.WIDE;
     }
-    assert other.isSingle();
+    assert other.isSinglePrimitive();
     return TypeLatticeElement.TOP;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeLatticeElement.java
index 6b56f08..85bd6fc 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class ShortTypeLatticeElement extends PrimitiveTypeLatticeElement {
+public class ShortTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
+
   private static final ShortTypeLatticeElement INSTANCE = new ShortTypeLatticeElement();
 
   static ShortTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeLatticeElement.java
new file mode 100644
index 0000000..2a94fb5
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeLatticeElement.java
@@ -0,0 +1,39 @@
+// Copyright (c) 2018, 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.analysis.type;
+
+/** A {@link TypeLatticeElement} that abstracts primitive types, which fit in 32 bits. */
+public class SinglePrimitiveTypeLatticeElement extends PrimitiveTypeLatticeElement {
+
+  private static final SinglePrimitiveTypeLatticeElement INSTANCE =
+      new SinglePrimitiveTypeLatticeElement();
+
+  SinglePrimitiveTypeLatticeElement() {
+    super();
+  }
+
+  static SinglePrimitiveTypeLatticeElement getInstance() {
+    return INSTANCE;
+  }
+
+  @Override
+  public boolean isSinglePrimitive() {
+    return true;
+  }
+
+  @Override
+  public String toString() {
+    return "SINGLE";
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return this == o;
+  }
+
+  @Override
+  public int hashCode() {
+    return System.identityHashCode(INSTANCE);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/SingleTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/SingleTypeLatticeElement.java
deleted file mode 100644
index 081bc60..0000000
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/SingleTypeLatticeElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2018, 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.analysis.type;
-
-/**
- * A {@link TypeLatticeElement} that abstracts primitive types, which fit in 32 bits.
- */
-public class SingleTypeLatticeElement extends PrimitiveTypeLatticeElement {
-  private static final SingleTypeLatticeElement SINGLE_INSTANCE = new SingleTypeLatticeElement();
-
-  SingleTypeLatticeElement() {
-    super();
-  }
-
-  static SingleTypeLatticeElement getInstance() {
-    return SINGLE_INSTANCE;
-  }
-
-  @Override
-  public boolean isSingle() {
-    return true;
-  }
-
-  @Override
-  public String toString() {
-    return "SINGLE";
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return this == o;
-  }
-
-  @Override
-  public int hashCode() {
-    return System.identityHashCode(SINGLE_INSTANCE);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElement.java
index 702d2f8..a9cd745 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElement.java
@@ -23,10 +23,12 @@
   static final CharTypeLatticeElement CHAR = CharTypeLatticeElement.getInstance();
   public static final IntTypeLatticeElement INT = IntTypeLatticeElement.getInstance();
   public static final FloatTypeLatticeElement FLOAT = FloatTypeLatticeElement.getInstance();
-  public static final SingleTypeLatticeElement SINGLE = SingleTypeLatticeElement.getInstance();
+  public static final SinglePrimitiveTypeLatticeElement SINGLE =
+      SinglePrimitiveTypeLatticeElement.getInstance();
   public static final LongTypeLatticeElement LONG = LongTypeLatticeElement.getInstance();
   public static final DoubleTypeLatticeElement DOUBLE = DoubleTypeLatticeElement.getInstance();
-  public static final WideTypeLatticeElement WIDE = WideTypeLatticeElement.getInstance();
+  public static final WidePrimitiveTypeLatticeElement WIDE =
+      WidePrimitiveTypeLatticeElement.getInstance();
   public static final ReferenceTypeLatticeElement NULL =
       ReferenceTypeLatticeElement.getNullTypeLatticeElement();
 
@@ -243,11 +245,11 @@
     return null;
   }
 
-  public boolean isSingle() {
+  public boolean isSinglePrimitive() {
     return false;
   }
 
-  public boolean isWide() {
+  public boolean isWidePrimitive() {
     return false;
   }
 
@@ -328,7 +330,7 @@
 
   public int requiredRegisters() {
     assert !isBottom() && !isTop();
-    return isWide() ? 2 : 1;
+    return 1;
   }
 
   public static ClassTypeLatticeElement objectClassType(
@@ -375,8 +377,8 @@
 
   public boolean isValueTypeCompatible(TypeLatticeElement other) {
     return (isReference() && other.isReference())
-        || (isSingle() && other.isSingle())
-        || (isWide() && other.isWide());
+        || (isSinglePrimitive() && other.isSinglePrimitive())
+        || (isWidePrimitive() && other.isWidePrimitive());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeLatticeElement.java
new file mode 100644
index 0000000..3e07e54
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeLatticeElement.java
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, 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.analysis.type;
+
+/** A {@link TypeLatticeElement} that abstracts primitive types, which fit in 64 bits. */
+public class WidePrimitiveTypeLatticeElement extends PrimitiveTypeLatticeElement {
+
+  private static final WidePrimitiveTypeLatticeElement INSTANCE =
+      new WidePrimitiveTypeLatticeElement();
+
+  WidePrimitiveTypeLatticeElement() {
+    super();
+  }
+
+  static WidePrimitiveTypeLatticeElement getInstance() {
+    return INSTANCE;
+  }
+
+  @Override
+  public boolean isWidePrimitive() {
+    return true;
+  }
+
+  @Override
+  public int requiredRegisters() {
+    return 2;
+  }
+
+  @Override
+  public String toString() {
+    return "WIDE";
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return this == o;
+  }
+
+  @Override
+  public int hashCode() {
+    return System.identityHashCode(INSTANCE);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/WideTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/WideTypeLatticeElement.java
deleted file mode 100644
index 9ea41a9..0000000
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/WideTypeLatticeElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2018, 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.analysis.type;
-
-/**
- * A {@link TypeLatticeElement} that abstracts primitive types, which fit in 64 bits.
- */
-public class WideTypeLatticeElement extends PrimitiveTypeLatticeElement {
-  private static final WideTypeLatticeElement WIDE_INSTANCE = new WideTypeLatticeElement();
-
-  WideTypeLatticeElement() {
-    super();
-  }
-
-  static WideTypeLatticeElement getInstance() {
-    return WIDE_INSTANCE;
-  }
-
-  @Override
-  public boolean isWide() {
-    return true;
-  }
-
-  @Override
-  public String toString() {
-    return "WIDE";
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return this == o;
-  }
-
-  @Override
-  public int hashCode() {
-    return System.identityHashCode(WIDE_INSTANCE);
-  }
-}
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 77bdbce..045acf6 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
@@ -217,11 +217,11 @@
         return TypeLatticeElement.DOUBLE;
       case INT_OR_FLOAT:
         assert arrayTypeLattice == null
-            || arrayTypeLattice.getArrayMemberTypeAsValueType().isSingle();
+            || arrayTypeLattice.getArrayMemberTypeAsValueType().isSinglePrimitive();
         return checkConstraint(dest(), ValueTypeConstraint.INT_OR_FLOAT);
       case LONG_OR_DOUBLE:
         assert arrayTypeLattice == null
-            || arrayTypeLattice.getArrayMemberTypeAsValueType().isWide();
+            || arrayTypeLattice.getArrayMemberTypeAsValueType().isWidePrimitive();
         return checkConstraint(dest(), ValueTypeConstraint.LONG_OR_DOUBLE);
       default:
         throw new Unreachable("Unexpected member type: " + getMemberType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/Dup.java b/src/main/java/com/android/tools/r8/ir/code/Dup.java
index 0a09d78..715190f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Dup.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Dup.java
@@ -64,7 +64,7 @@
 
   @Override
   public void buildCf(CfBuilder builder) {
-    if (this.inValues.get(0).getTypeLattice().isWide()) {
+    if (this.inValues.get(0).getTypeLattice().isWidePrimitive()) {
       builder.add(new CfStackInstruction(Opcode.Dup2));
     } else {
       builder.add(new CfStackInstruction(Opcode.Dup));
diff --git a/src/main/java/com/android/tools/r8/ir/code/Dup2.java b/src/main/java/com/android/tools/r8/ir/code/Dup2.java
index 6564fbe..cb80e23 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Dup2.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Dup2.java
@@ -32,8 +32,8 @@
 
   private Dup2(StackValues dest, Value srcBottom, Value srcTop) {
     super(dest, ImmutableList.of(srcBottom, srcTop));
-    assert !srcBottom.getTypeLattice().isWide();
-    assert !srcTop.getTypeLattice().isWide();
+    assert !srcBottom.getTypeLattice().isWidePrimitive();
+    assert !srcTop.getTypeLattice().isWidePrimitive();
     assert dest.getStackValues().length == 4;
     assert srcBottom.isValueOnStack() && !(srcBottom instanceof StackValues);
     assert srcTop.isValueOnStack() && !(srcTop instanceof StackValues);
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 e8f995b..f7411d9 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
@@ -22,7 +22,7 @@
   public ValueType outType() {
     TypeLatticeElement type = getTypeLattice();
     if (type.isPrimitive()) {
-      if (type.isSingle()) {
+      if (type.isSinglePrimitive()) {
         if (type.isInt()) {
           return ValueType.INT;
         }
@@ -30,7 +30,7 @@
           return ValueType.FLOAT;
         }
       } else {
-        assert type.isWide();
+        assert type.isWidePrimitive();
         if (type.isDouble()) {
           return ValueType.DOUBLE;
         }
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 b515ab3..44864f6 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
@@ -166,9 +166,9 @@
       TypeLatticeElement moveType = outValue.getTypeLattice();
       int register = builder.allocatedRegister(outValue, getNumber());
       com.android.tools.r8.code.Instruction moveResult;
-      if (moveType.isSingle()) {
+      if (moveType.isSinglePrimitive()) {
         moveResult = new MoveResult(register);
-      } else if (moveType.isWide()) {
+      } else if (moveType.isWidePrimitive()) {
         moveResult = new MoveResultWide(register);
       } else if (moveType.isReference()) {
         moveResult = new MoveResultObject(register);
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 163b27a..9ac794c 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
@@ -56,10 +56,10 @@
     if (returnType.isReference()) {
       return new ReturnObject(register);
     }
-    if (returnType.isSingle()) {
+    if (returnType.isSinglePrimitive()) {
       return new com.android.tools.r8.code.Return(register);
     }
-    if (returnType.isWide()) {
+    if (returnType.isWidePrimitive()) {
       return new ReturnWide(register);
     }
     throw new Unreachable();
diff --git a/src/main/java/com/android/tools/r8/ir/code/Swap.java b/src/main/java/com/android/tools/r8/ir/code/Swap.java
index a43979c..93e3976 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Swap.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Swap.java
@@ -25,7 +25,7 @@
     super(dest, ImmutableList.of(src1, src2));
     assert src1.isValueOnStack() && !(src1 instanceof StackValues);
     assert src2.isValueOnStack() && !(src2 instanceof StackValues);
-    assert !src1.getTypeLattice().isWide() && !src2.getTypeLattice().isWide();
+    assert !src1.getTypeLattice().isWidePrimitive() && !src2.getTypeLattice().isWidePrimitive();
   }
 
   @Override
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 fde5ca7..1d2c6ca 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -53,7 +53,8 @@
   }
 
   public TypeLatticeElement constrainedType(ValueTypeConstraint constraint) {
-    if (constraint == ValueTypeConstraint.INT_OR_FLOAT_OR_OBJECT && !typeLattice.isWide()) {
+    if (constraint == ValueTypeConstraint.INT_OR_FLOAT_OR_OBJECT
+        && !typeLattice.isWidePrimitive()) {
       return typeLattice;
     }
     switch (constraint) {
@@ -79,12 +80,12 @@
         }
         break;
       case INT:
-        if (typeLattice.isTop() || (typeLattice.isSingle() && !typeLattice.isFloat())) {
+        if (typeLattice.isTop() || (typeLattice.isSinglePrimitive() && !typeLattice.isFloat())) {
           return TypeLatticeElement.INT;
         }
         break;
       case FLOAT:
-        if (typeLattice.isTop() || (typeLattice.isSingle() && !typeLattice.isInt())) {
+        if (typeLattice.isTop() || (typeLattice.isSinglePrimitive() && !typeLattice.isInt())) {
           return TypeLatticeElement.FLOAT;
         }
         break;
@@ -92,22 +93,22 @@
         if (typeLattice.isTop()) {
           return TypeLatticeElement.SINGLE;
         }
-        if (typeLattice.isSingle()) {
+        if (typeLattice.isSinglePrimitive()) {
           return typeLattice;
         }
         break;
       case LONG:
-        if (typeLattice.isWide()) {
+        if (typeLattice.isWidePrimitive()) {
           return TypeLatticeElement.LONG;
         }
         break;
       case DOUBLE:
-        if (typeLattice.isWide()) {
+        if (typeLattice.isWidePrimitive()) {
           return TypeLatticeElement.DOUBLE;
         }
         break;
       case LONG_OR_DOUBLE:
-        if (typeLattice.isWide()) {
+        if (typeLattice.isWidePrimitive()) {
           return typeLattice;
         }
         break;
@@ -747,7 +748,7 @@
       builder.append("(");
       if (isConstant && definition.asConstNumber().outValue != null) {
         ConstNumber constNumber = definition.asConstNumber();
-        if (constNumber.outValue().getTypeLattice().isSingle()) {
+        if (constNumber.outValue().getTypeLattice().isSinglePrimitive()) {
           builder.append((int) constNumber.getRawValue());
         } else {
           builder.append(constNumber.getRawValue());
@@ -926,11 +927,11 @@
 
   public LongInterval getValueRange() {
     if (isConstNumber()) {
-      if (typeLattice.isSingle()) {
+      if (typeLattice.isSinglePrimitive()) {
         int value = getConstInstruction().asConstNumber().getIntValue();
         return new LongInterval(value, value);
       } else {
-        assert typeLattice.isWide();
+        assert typeLattice.isWidePrimitive();
         long value = getConstInstruction().asConstNumber().getLongValue();
         return new LongInterval(value, value);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ValueTypeConstraint.java b/src/main/java/com/android/tools/r8/ir/code/ValueTypeConstraint.java
index 9ee7b0f..eb0ba83 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ValueTypeConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ValueTypeConstraint.java
@@ -145,10 +145,10 @@
     if (typeLatticeElement.isDouble()) {
       return DOUBLE;
     }
-    if (typeLatticeElement.isSingle()) {
+    if (typeLatticeElement.isSinglePrimitive()) {
       return INT_OR_FLOAT;
     }
-    if (typeLatticeElement.isWide()) {
+    if (typeLatticeElement.isWidePrimitive()) {
       return LONG_OR_DOUBLE;
     }
     if (typeLatticeElement.isTop()) {
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 9e7b696..5763523 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
@@ -1420,9 +1420,9 @@
             instruction = new Nop();
             break;
           }
-          if (moveType.isSingle()) {
+          if (moveType.isSinglePrimitive()) {
             instruction = new com.android.tools.r8.code.Move(dest, src);
-          } else if (moveType.isWide()) {
+          } else if (moveType.isWidePrimitive()) {
             instruction = new MoveWide(dest, src);
           } else if (moveType.isReference()) {
             instruction = new MoveObject(dest, src);
@@ -1431,9 +1431,9 @@
           }
           break;
         case 2:
-          if (moveType.isSingle()) {
+          if (moveType.isSinglePrimitive()) {
             instruction = new MoveFrom16(dest, src);
-          } else if (moveType.isWide()) {
+          } else if (moveType.isWidePrimitive()) {
             instruction = new MoveWideFrom16(dest, src);
           } else if (moveType.isReference()) {
             instruction = new MoveObjectFrom16(dest, src);
@@ -1442,9 +1442,9 @@
           }
           break;
         case 3:
-          if (moveType.isSingle()) {
+          if (moveType.isSinglePrimitive()) {
             instruction = new Move16(dest, src);
-          } else if (moveType.isWide()) {
+          } else if (moveType.isWidePrimitive()) {
             instruction = new MoveWide16(dest, src);
           } else if (moveType.isReference()) {
             instruction = new MoveObject16(dest, src);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/DupDupDupPeephole.java b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/DupDupDupPeephole.java
index 78e90a9..8d84870 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/DupDupDupPeephole.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/DupDupDupPeephole.java
@@ -28,11 +28,11 @@
 public class DupDupDupPeephole implements BasicBlockPeephole {
 
   private final Point dup1Exp =
-      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWide());
+      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWidePrimitive());
   private final Point dup2Exp =
-      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWide());
+      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWidePrimitive());
   private final Point dup3Exp =
-      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWide());
+      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWidePrimitive());
 
   private final PeepholeLayout layout = PeepholeLayout.lookBackward(dup1Exp, dup2Exp, dup3Exp);
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/StoreSequenceLoadPeephole.java b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/StoreSequenceLoadPeephole.java
index 3863945..421bdbf 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/StoreSequenceLoadPeephole.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/StoreSequenceLoadPeephole.java
@@ -40,7 +40,7 @@
       new Point(
           (i) -> {
             if (!i.isStore()
-                || i.asStore().src().getTypeLattice().isWide()
+                || i.asStore().src().getTypeLattice().isWidePrimitive()
                 || i.outValue().hasLocalInfo()
                 || i.asStore().outValue().numberOfAllUsers() != 1) {
               return false;
@@ -102,7 +102,7 @@
       lastOut = stackValues[stackValues.length - 1];
     }
 
-    if (lastOut == null || lastOut.getTypeLattice().isWide()) {
+    if (lastOut == null || lastOut.getTypeLattice().isWidePrimitive()) {
       return false;
     }
 
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 92992e8..dda59e6 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
@@ -33,7 +33,7 @@
   }
 
   private boolean writes(int register) {
-    if (type.isWide() && (dst + 1) == register) {
+    if (type.isWidePrimitive() && (dst + 1) == register) {
       return true;
     }
     return dst == register;
@@ -48,7 +48,7 @@
         if (writes(valueMap.get(move.src))) {
           return true;
         }
-        if (move.type.isWide()) {
+        if (move.type.isWidePrimitive()) {
           if (writes(valueMap.get(move.src) + 1)) {
             return true;
           }
@@ -85,8 +85,8 @@
     if (type.isPrimitive() != o.type.isPrimitive()) {
       return Boolean.compare(type.isPrimitive(), o.type.isPrimitive());
     }
-    if (type.isWide() != o.type.isWide()) {
-      return Boolean.compare(type.isWide(), o.type.isWide());
+    if (type.isWidePrimitive() != o.type.isWidePrimitive()) {
+      return Boolean.compare(type.isWidePrimitive(), o.type.isWidePrimitive());
     }
     if (type.isReference() != o.type.isReference()) {
       return Boolean.compare(type.isReference(), o.type.isReference());
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 d268d62..08afab7 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
@@ -124,9 +124,9 @@
       int moveSrc = valueMap.get(move.src);
       if (moveSrc == src) {
         result.add(move);
-      } else if (move.type.isWide() && (moveSrc + 1) == src) {
+      } else if (move.type.isWidePrimitive() && (moveSrc + 1) == src) {
         result.add(move);
-      } else if (type.isWide() && (moveSrc - 1) == src) {
+      } else if (type.isWidePrimitive() && (moveSrc - 1) == src) {
         result.add(move);
       }
     }
@@ -194,7 +194,7 @@
     // Pick a non-wide move to unblock if possible.
     while (iterator.hasNext()) {
       move = iterator.next();
-      if (!move.type.isWide()) {
+      if (!move.type.isWidePrimitive()) {
         break;
       }
     }
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 e8c54f5..aae72b4 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
@@ -201,8 +201,8 @@
     TypeLatticeElement toType = to.getValue().getTypeLattice();
     TypeLatticeElement fromType = from.getValue().getTypeLattice();
     if (toType.isReference() || fromType.isReference()) {
-      assert fromType.isReference() || fromType.isSingle();
-      assert toType.isReference() || toType.isSingle();
+      assert fromType.isReference() || fromType.isSinglePrimitive();
+      assert toType.isReference() || toType.isSinglePrimitive();
       return objectType;
     }
     assert toType == fromType;
@@ -370,7 +370,7 @@
         // avoid a bug where the index variable could end up being uninitialized.
         if (allocator.options().canHaveBoundsCheckEliminationBug()
             && move.from.getValue().isConstNumber()
-            && move.type.isSingle()
+            && move.type.isSinglePrimitive()
             && allocator.unadjustedRealRegisterFromAllocated(move.to.getRegister()) < 256) {
           scheduler.addMove(
               new RegisterMove(move.to.getRegister(), move.type, move.from.getValue().definition));
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElementWidthTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElementWidthTest.java
new file mode 100644
index 0000000..d6b9598
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElementWidthTest.java
@@ -0,0 +1,94 @@
+// Copyright (c) 2019, 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.analysis.type;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+
+public class TypeLatticeElementWidthTest extends TestBase {
+
+  @Test
+  public void testArrayWidth() {
+    ArrayTypeLatticeElement arrayType =
+        ArrayTypeLatticeElement.create(
+            IntTypeLatticeElement.getInstance(), Nullability.maybeNull());
+    assertFalse(arrayType.isSinglePrimitive());
+    assertFalse(arrayType.isWidePrimitive());
+    assertEquals(1, arrayType.requiredRegisters());
+  }
+
+  @Test
+  public void testBooleanWidth() {
+    assertTrue(BooleanTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(BooleanTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, BooleanTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testByteWidth() {
+    assertTrue(ByteTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(ByteTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, ByteTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testCharWidth() {
+    assertTrue(CharTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(CharTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, CharTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testDoubleWidth() {
+    assertTrue(DoubleTypeLatticeElement.getInstance().isWidePrimitive());
+    assertFalse(DoubleTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertEquals(2, DoubleTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testFloatWidth() {
+    assertTrue(FloatTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(FloatTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, FloatTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testIntWidth() {
+    assertTrue(IntTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(IntTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, IntTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testLongWidth() {
+    assertTrue(LongTypeLatticeElement.getInstance().isWidePrimitive());
+    assertFalse(LongTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertEquals(2, LongTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testReferenceWidth() {
+    DexItemFactory dexItemFactory = new DexItemFactory();
+    ClassTypeLatticeElement referenceType =
+        ClassTypeLatticeElement.create(
+            dexItemFactory.objectType, Nullability.maybeNull(), ImmutableSet.of());
+    assertFalse(referenceType.isSinglePrimitive());
+    assertFalse(referenceType.isWidePrimitive());
+    assertEquals(1, referenceType.requiredRegisters());
+  }
+
+  @Test
+  public void testShortWidth() {
+    assertTrue(ShortTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(ShortTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, ShortTypeLatticeElement.getInstance().requiredRegisters());
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
index 54f1a68..25988b8 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
@@ -71,11 +71,11 @@
     return TypeLatticeElement.BOTTOM;
   }
 
-  private SingleTypeLatticeElement single() {
+  private SinglePrimitiveTypeLatticeElement single() {
     return TypeLatticeElement.SINGLE;
   }
 
-  private WideTypeLatticeElement wide() {
+  private WidePrimitiveTypeLatticeElement wide() {
     return TypeLatticeElement.WIDE;
   }
 
