Remove static field declarations in parent class TypeLatticeElement.

Change-Id: I4928a9b7d09a3ed099aae535ff01d39bd8e1d3af
diff --git a/src/main/java/com/android/tools/r8/code/Const.java b/src/main/java/com/android/tools/r8/code/Const.java
index 1f5c1f1..9026684 100644
--- a/src/main/java/com/android/tools/r8/code/Const.java
+++ b/src/main/java/com/android/tools/r8/code/Const.java
@@ -59,7 +59,7 @@
   public void buildIR(IRBuilder builder) {
     int value = decodedValue();
     TypeLatticeElement typeLattice =
-        value == 0 ? TypeLatticeElement.TOP : TypeLatticeElement.SINGLE;
+        value == 0 ? TypeLatticeElement.getTop() : TypeLatticeElement.getSingle();
     builder.addConst(typeLattice, AA, value);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Const16.java b/src/main/java/com/android/tools/r8/code/Const16.java
index 5bee254..f859228 100644
--- a/src/main/java/com/android/tools/r8/code/Const16.java
+++ b/src/main/java/com/android/tools/r8/code/Const16.java
@@ -53,7 +53,7 @@
   public void buildIR(IRBuilder builder) {
     int value = decodedValue();
     TypeLatticeElement typeLattice =
-        value == 0 ? TypeLatticeElement.TOP : TypeLatticeElement.SINGLE;
+        value == 0 ? TypeLatticeElement.getTop() : TypeLatticeElement.getSingle();
     builder.addConst(typeLattice, AA, value);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Const4.java b/src/main/java/com/android/tools/r8/code/Const4.java
index 4f73b29..a036d57 100644
--- a/src/main/java/com/android/tools/r8/code/Const4.java
+++ b/src/main/java/com/android/tools/r8/code/Const4.java
@@ -59,7 +59,7 @@
   public void buildIR(IRBuilder builder) {
     int value = decodedValue();
     TypeLatticeElement typeLattice =
-        value == 0 ? TypeLatticeElement.TOP : TypeLatticeElement.SINGLE;
+        value == 0 ? TypeLatticeElement.getTop() : TypeLatticeElement.getSingle();
     builder.addConst(typeLattice, A, value);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstHigh16.java b/src/main/java/com/android/tools/r8/code/ConstHigh16.java
index 28d1c73..f3821a6 100644
--- a/src/main/java/com/android/tools/r8/code/ConstHigh16.java
+++ b/src/main/java/com/android/tools/r8/code/ConstHigh16.java
@@ -59,7 +59,7 @@
   public void buildIR(IRBuilder builder) {
     int value = decodedValue();
     TypeLatticeElement typeLattice =
-        value == 0 ? TypeLatticeElement.TOP : TypeLatticeElement.SINGLE;
+        value == 0 ? TypeLatticeElement.getTop() : TypeLatticeElement.getSingle();
     builder.addConst(typeLattice, AA, value);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide.java b/src/main/java/com/android/tools/r8/code/ConstWide.java
index 1820172..31c1089 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide.java
+++ b/src/main/java/com/android/tools/r8/code/ConstWide.java
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(TypeLatticeElement.WIDE, AA, decodedValue());
+    builder.addConst(TypeLatticeElement.getWide(), AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide16.java b/src/main/java/com/android/tools/r8/code/ConstWide16.java
index ad7e84f..2f7634d 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide16.java
+++ b/src/main/java/com/android/tools/r8/code/ConstWide16.java
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(TypeLatticeElement.WIDE, AA, decodedValue());
+    builder.addConst(TypeLatticeElement.getWide(), AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide32.java b/src/main/java/com/android/tools/r8/code/ConstWide32.java
index 0b75213..51ef097 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide32.java
+++ b/src/main/java/com/android/tools/r8/code/ConstWide32.java
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(TypeLatticeElement.WIDE, AA, decodedValue());
+    builder.addConst(TypeLatticeElement.getWide(), AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java b/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java
index e139b35..8437a35 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java
+++ b/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java
@@ -57,6 +57,6 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addConst(TypeLatticeElement.WIDE, AA, decodedValue());
+    builder.addConst(TypeLatticeElement.getWide(), AA, decodedValue());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeLatticeElement.java
index e2af564..39ebff8 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeLatticeElement.java
@@ -63,7 +63,7 @@
   }
 
   public TypeLatticeElement getArrayMemberTypeAsValueType() {
-    return memberTypeLattice.isFineGrainedType() ? INT : memberTypeLattice;
+    return memberTypeLattice.isFineGrainedType() ? getInt() : memberTypeLattice;
   }
 
   public TypeLatticeElement getArrayBaseTypeLattice() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
index 10f2d3e..3af208a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
@@ -40,7 +40,7 @@
     Deque<Phi> worklist = new ArrayDeque<>(affectedPhis);
     while (!worklist.isEmpty()) {
       Phi phi = worklist.poll();
-      phi.setTypeLattice(TypeLatticeElement.BOTTOM);
+      phi.setTypeLattice(TypeLatticeElement.getBottom());
       for (Phi affectedPhi : phi.uniquePhiUsers()) {
         if (affectedPhis.add(affectedPhi)) {
           worklist.add(affectedPhi);
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 f43ebab..6a16fdc 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
@@ -78,32 +78,32 @@
     switch (descriptor) {
       case 'Z':
         if (asArrayElementType) {
-          return TypeLatticeElement.BOOLEAN;
+          return TypeLatticeElement.getBoolean();
         }
         // fall through
       case 'B':
         if (asArrayElementType) {
-          return TypeLatticeElement.BYTE;
+          return TypeLatticeElement.getByte();
         }
         // fall through
       case 'S':
         if (asArrayElementType) {
-          return TypeLatticeElement.SHORT;
+          return TypeLatticeElement.getShort();
         }
         // fall through
       case 'C':
         if (asArrayElementType) {
-          return TypeLatticeElement.CHAR;
+          return TypeLatticeElement.getChar();
         }
         // fall through
       case 'I':
-        return TypeLatticeElement.INT;
+        return TypeLatticeElement.getInt();
       case 'F':
-        return TypeLatticeElement.FLOAT;
+        return TypeLatticeElement.getFloat();
       case 'J':
-        return TypeLatticeElement.LONG;
+        return TypeLatticeElement.getLong();
       case 'D':
-        return TypeLatticeElement.DOUBLE;
+        return TypeLatticeElement.getDouble();
       case 'V':
         throw new InternalCompilerError("No value type for void type.");
       default:
@@ -117,13 +117,13 @@
       case CHAR:
       case SHORT:
       case INT:
-        return TypeLatticeElement.INT;
+        return TypeLatticeElement.getInt();
       case FLOAT:
-        return TypeLatticeElement.FLOAT;
+        return TypeLatticeElement.getFloat();
       case LONG:
-        return TypeLatticeElement.LONG;
+        return TypeLatticeElement.getLong();
       case DOUBLE:
-        return TypeLatticeElement.DOUBLE;
+        return TypeLatticeElement.getDouble();
       default:
         throw new Unreachable("Invalid numeric type '" + numericType + "'");
     }
@@ -135,16 +135,16 @@
     }
     if (isSinglePrimitive()) {
       if (other.isSinglePrimitive()) {
-        return TypeLatticeElement.SINGLE;
+        return TypeLatticeElement.getSingle();
       }
       assert other.isWidePrimitive();
-      return TypeLatticeElement.TOP;
+      return TypeLatticeElement.getTop();
     }
     assert isWidePrimitive();
     if (other.isWidePrimitive()) {
-      return TypeLatticeElement.WIDE;
+      return TypeLatticeElement.getWide();
     }
     assert other.isSinglePrimitive();
-    return TypeLatticeElement.TOP;
+    return TypeLatticeElement.getTop();
   }
 }
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 09a9fad..de7b894 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
@@ -16,22 +16,58 @@
  * The base abstraction of lattice elements for local type analysis.
  */
 public abstract class TypeLatticeElement {
-  public static final BottomTypeLatticeElement BOTTOM = BottomTypeLatticeElement.getInstance();
-  public static final TopTypeLatticeElement TOP = TopTypeLatticeElement.getInstance();
-  public static final BooleanTypeLatticeElement BOOLEAN = BooleanTypeLatticeElement.getInstance();
-  public static final ByteTypeLatticeElement BYTE = ByteTypeLatticeElement.getInstance();
-  static final ShortTypeLatticeElement SHORT = ShortTypeLatticeElement.getInstance();
-  static final CharTypeLatticeElement CHAR = CharTypeLatticeElement.getInstance();
-  public static final IntTypeLatticeElement INT = IntTypeLatticeElement.getInstance();
-  public static final FloatTypeLatticeElement FLOAT = FloatTypeLatticeElement.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 WidePrimitiveTypeLatticeElement WIDE =
-      WidePrimitiveTypeLatticeElement.getInstance();
-  public static final ReferenceTypeLatticeElement NULL =
-      ReferenceTypeLatticeElement.getNullTypeLatticeElement();
+
+  public static BottomTypeLatticeElement getBottom() {
+    return BottomTypeLatticeElement.getInstance();
+  }
+
+  public static TopTypeLatticeElement getTop() {
+    return TopTypeLatticeElement.getInstance();
+  }
+
+  public static BooleanTypeLatticeElement getBoolean() {
+    return BooleanTypeLatticeElement.getInstance();
+  }
+
+  public static ByteTypeLatticeElement getByte() {
+    return ByteTypeLatticeElement.getInstance();
+  }
+
+  public static ShortTypeLatticeElement getShort() {
+    return ShortTypeLatticeElement.getInstance();
+  }
+
+  public static CharTypeLatticeElement getChar() {
+    return CharTypeLatticeElement.getInstance();
+  }
+
+  public static IntTypeLatticeElement getInt() {
+    return IntTypeLatticeElement.getInstance();
+  }
+
+  public static FloatTypeLatticeElement getFloat() {
+    return FloatTypeLatticeElement.getInstance();
+  }
+
+  public static SinglePrimitiveTypeLatticeElement getSingle() {
+    return SinglePrimitiveTypeLatticeElement.getInstance();
+  }
+
+  public static LongTypeLatticeElement getLong() {
+    return LongTypeLatticeElement.getInstance();
+  }
+
+  public static DoubleTypeLatticeElement getDouble() {
+    return DoubleTypeLatticeElement.getInstance();
+  }
+
+  public static WidePrimitiveTypeLatticeElement getWide() {
+    return WidePrimitiveTypeLatticeElement.getInstance();
+  }
+
+  public static ReferenceTypeLatticeElement getNull() {
+    return ReferenceTypeLatticeElement.getNullTypeLatticeElement();
+  }
 
   public TypeLatticeElement fixupClassTypeReferences(
       Function<DexType, DexType> mapping, AppView<? extends AppInfoWithSubtyping> appView) {
@@ -62,16 +98,16 @@
       return this;
     }
     if (isTop() || other.isTop()) {
-      return TOP;
+      return getTop();
     }
     if (isPrimitive()) {
       return other.isPrimitive()
           ? asPrimitiveTypeLatticeElement().join(other.asPrimitiveTypeLatticeElement())
-          : TOP;
+          : getTop();
     }
     if (other.isPrimitive()) {
       // By the above case, !(isPrimitive())
-      return TOP;
+      return getTop();
     }
     // From now on, this and other are precise reference types, i.e., either ArrayType or ClassType.
     assert isReference() && other.isReference();
@@ -100,7 +136,7 @@
 
   public static TypeLatticeElement join(
       Iterable<TypeLatticeElement> typeLattices, AppView<?> appView) {
-    TypeLatticeElement result = BOTTOM;
+    TypeLatticeElement result = getBottom();
     for (TypeLatticeElement other : typeLattices) {
       result = result.join(other, appView);
     }
@@ -373,7 +409,7 @@
       DexType type, Nullability nullability, AppView<?> appView, boolean asArrayElementType) {
     if (type == DexItemFactory.nullValueType) {
       assert !nullability.isDefinitelyNotNull();
-      return NULL;
+      return getNull();
     }
     if (type.isPrimitiveType()) {
       return PrimitiveTypeLatticeElement.fromDexType(type, asArrayElementType);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
index 64401fd..9a43d23 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
@@ -66,7 +66,7 @@
     assert !typeLattice.isReference() || value == 0;
     Value returnedValue =
         code.createValue(
-            typeLattice.isReference() ? TypeLatticeElement.NULL : typeLattice, debugLocalInfo);
+            typeLattice.isReference() ? TypeLatticeElement.getNull() : typeLattice, debugLocalInfo);
     return new ConstNumber(returnedValue, value);
   }
 
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 cc154e9..5d97e99 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
@@ -140,20 +140,20 @@
       ConstNumber newConst;
       if (type == NumericType.INT) {
         int result = foldIntegers(leftConst.getIntValue(), rightConst.getIntValue());
-        Value value = code.createValue(TypeLatticeElement.INT, getLocalInfo());
+        Value value = code.createValue(TypeLatticeElement.getInt(), getLocalInfo());
         newConst = new ConstNumber(value, result);
       } else if (type == NumericType.LONG) {
         long result = foldLongs(leftConst.getLongValue(), rightConst.getLongValue());
-        Value value = code.createValue(TypeLatticeElement.LONG, getLocalInfo());
+        Value value = code.createValue(TypeLatticeElement.getLong(), getLocalInfo());
         newConst = new ConstNumber(value, result);
       } else if (type == NumericType.FLOAT) {
         float result = foldFloat(leftConst.getFloatValue(), rightConst.getFloatValue());
-        Value value = code.createValue(TypeLatticeElement.FLOAT, getLocalInfo());
+        Value value = code.createValue(TypeLatticeElement.getFloat(), getLocalInfo());
         newConst = new ConstNumber(value, Float.floatToIntBits(result));
       } else {
         assert type == NumericType.DOUBLE;
         double result = foldDouble(leftConst.getDoubleValue(), rightConst.getDoubleValue());
-        Value value = code.createValue(TypeLatticeElement.DOUBLE, getLocalInfo());
+        Value value = code.createValue(TypeLatticeElement.getDouble(), getLocalInfo());
         newConst = new ConstNumber(value, Double.doubleToLongBits(result));
       }
       return new ConstLatticeElement(newConst);
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 d90bf21..0c118fb 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
@@ -96,11 +96,11 @@
       case BOOLEAN_OR_BYTE:
         ArrayTypeLatticeElement arrayType = array().getTypeLattice().asArrayTypeLatticeElement();
         if (arrayType != null
-            && arrayType.getArrayMemberTypeAsMemberType() == TypeLatticeElement.BOOLEAN) {
+            && arrayType.getArrayMemberTypeAsMemberType() == TypeLatticeElement.getBoolean()) {
           instruction = new AgetBoolean(dest, array, index);
         } else {
           assert array().getTypeLattice().isDefinitelyNull()
-              || arrayType.getArrayMemberTypeAsMemberType() == TypeLatticeElement.BYTE;
+              || arrayType.getArrayMemberTypeAsMemberType() == TypeLatticeElement.getByte();
           instruction = new AgetByte(dest, array, index);
         }
         break;
@@ -203,9 +203,10 @@
         // the instruction cannot return. For now we return NULL as the type to ensure we have a
         // type consistent witness for the out-value type. We could consider returning bottom in
         // this case as the value is indeed empty, i.e., the instruction will always fail.
-        TypeLatticeElement valueType = arrayTypeLattice == null
-            ? TypeLatticeElement.NULL
-            : arrayTypeLattice.getArrayMemberTypeAsValueType();
+        TypeLatticeElement valueType =
+            arrayTypeLattice == null
+                ? TypeLatticeElement.getNull()
+                : arrayTypeLattice.getArrayMemberTypeAsValueType();
         assert valueType.isReference();
         return valueType;
       case BOOLEAN_OR_BYTE:
@@ -214,19 +215,19 @@
       case INT:
         assert arrayTypeLattice == null
             || arrayTypeLattice.getArrayMemberTypeAsValueType().isInt();
-        return TypeLatticeElement.INT;
+        return TypeLatticeElement.getInt();
       case FLOAT:
         assert arrayTypeLattice == null
             || arrayTypeLattice.getArrayMemberTypeAsValueType().isFloat();
-        return TypeLatticeElement.FLOAT;
+        return TypeLatticeElement.getFloat();
       case LONG:
         assert arrayTypeLattice == null
             || arrayTypeLattice.getArrayMemberTypeAsValueType().isLong();
-        return TypeLatticeElement.LONG;
+        return TypeLatticeElement.getLong();
       case DOUBLE:
         assert arrayTypeLattice == null
             || arrayTypeLattice.getArrayMemberTypeAsValueType().isDouble();
-        return TypeLatticeElement.DOUBLE;
+        return TypeLatticeElement.getDouble();
       case INT_OR_FLOAT:
         assert arrayTypeLattice == null
             || arrayTypeLattice.getArrayMemberTypeAsValueType().isSinglePrimitive();
@@ -268,7 +269,7 @@
   public boolean outTypeKnownToBeBoolean(Set<Phi> seen) {
     return array().getTypeLattice().isArrayType()
         && array().getTypeLattice().asArrayTypeLatticeElement().getArrayMemberTypeAsMemberType()
-        == TypeLatticeElement.BOOLEAN;
+            == TypeLatticeElement.getBoolean();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
index f767de8..b2f908c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
@@ -131,7 +131,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppView<?> appView) {
-    return TypeLatticeElement.INT;
+    return TypeLatticeElement.getInt();
   }
 
   @Override
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 8917cc0..b8d8526 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
@@ -92,11 +92,11 @@
       case BOOLEAN_OR_BYTE:
         ArrayTypeLatticeElement arrayType = array().getTypeLattice().asArrayTypeLatticeElement();
         if (arrayType != null
-            && arrayType.getArrayMemberTypeAsMemberType() == TypeLatticeElement.BOOLEAN) {
+            && arrayType.getArrayMemberTypeAsMemberType() == TypeLatticeElement.getBoolean()) {
           instruction = new AputBoolean(value, array, index);
         } else {
           assert array().getTypeLattice().isDefinitelyNull()
-              || arrayType.getArrayMemberTypeAsMemberType() == TypeLatticeElement.BYTE;
+              || arrayType.getArrayMemberTypeAsMemberType() == TypeLatticeElement.getByte();
           instruction = new AputByte(value, array, index);
         }
         break;
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
index 301be93..3cae82a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
@@ -719,7 +719,7 @@
             new Phi(
                 code.valueNumberGenerator.next(),
                 newExitBlock,
-                TypeLatticeElement.BOTTOM,
+                TypeLatticeElement.getBottom(),
                 null,
                 RegisterReadType.NORMAL);
         phi.addOperands(operands);
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 97c76ce..acccf31 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
@@ -186,7 +186,7 @@
           result = (int) Math.signum(left - right);
         }
       }
-      Value value = code.createValue(TypeLatticeElement.INT, getLocalInfo());
+      Value value = code.createValue(TypeLatticeElement.getInt(), getLocalInfo());
       ConstNumber newConst = new ConstNumber(value, result);
       return new ConstLatticeElement(newConst);
     } else if (leftLattice.isValueRange() && rightLattice.isConst()) {
@@ -214,7 +214,7 @@
       return Bottom.getInstance();
     }
     int result = Integer.signum(Long.compare(leftRange.getMin(), rightRange.getMin()));
-    Value value = code.createValue(TypeLatticeElement.INT, getLocalInfo());
+    Value value = code.createValue(TypeLatticeElement.getInt(), getLocalInfo());
     ConstNumber newConst = new ConstNumber(value, result);
     return new ConstLatticeElement(newConst);
   }
@@ -236,7 +236,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppView<?> appView) {
-    return TypeLatticeElement.INT;
+    return TypeLatticeElement.getInt();
   }
 
 }
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 ff765e5..39c3d39 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
@@ -1050,12 +1050,12 @@
   }
 
   public ConstNumber createDoubleConstant(double value, DebugLocalInfo local) {
-    Value out = createValue(TypeLatticeElement.DOUBLE, local);
+    Value out = createValue(TypeLatticeElement.getDouble(), local);
     return new ConstNumber(out, Double.doubleToLongBits(value));
   }
 
   public ConstNumber createFloatConstant(float value, DebugLocalInfo local) {
-    Value out = createValue(TypeLatticeElement.FLOAT, local);
+    Value out = createValue(TypeLatticeElement.getFloat(), local);
     return new ConstNumber(out, Float.floatToIntBits(value));
   }
 
@@ -1064,12 +1064,12 @@
   }
 
   public ConstNumber createIntConstant(int value, DebugLocalInfo local) {
-    Value out = createValue(TypeLatticeElement.INT, local);
+    Value out = createValue(TypeLatticeElement.getInt(), local);
     return new ConstNumber(out, value);
   }
 
   public ConstNumber createLongConstant(long value, DebugLocalInfo local) {
-    Value out = createValue(TypeLatticeElement.LONG, local);
+    Value out = createValue(TypeLatticeElement.getLong(), local);
     return new ConstNumber(out, value);
   }
 
@@ -1088,12 +1088,12 @@
   }
 
   public ConstNumber createConstNull() {
-    Value out = createValue(TypeLatticeElement.NULL);
+    Value out = createValue(TypeLatticeElement.getNull());
     return new ConstNumber(out, 0);
   }
 
   public ConstNumber createConstNull(DebugLocalInfo local) {
-    Value out = createValue(TypeLatticeElement.NULL, local);
+    Value out = createValue(TypeLatticeElement.getNull(), local);
     return new ConstNumber(out, 0);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
index d59316f..de4fa66 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
@@ -92,7 +92,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppView<?> appView) {
-    return TypeLatticeElement.INT;
+    return TypeLatticeElement.getInt();
   }
 
   @Override
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 ad3d344..7f87253 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
@@ -117,7 +117,7 @@
       ConstNumber newConst;
       if (type == NumericType.INT) {
         int result = foldIntegers(leftConst.getIntValue(), rightConst.getIntValue());
-        Value value = code.createValue(TypeLatticeElement.INT, getLocalInfo());
+        Value value = code.createValue(TypeLatticeElement.getInt(), getLocalInfo());
         newConst = new ConstNumber(value, result);
       } else {
         assert type == NumericType.LONG;
@@ -129,7 +129,7 @@
           right = rightConst.getLongValue();
         }
         long result = foldLongs(leftConst.getLongValue(), right);
-        Value value = code.createValue(TypeLatticeElement.LONG, getLocalInfo());
+        Value value = code.createValue(TypeLatticeElement.getLong(), getLocalInfo());
         newConst = new ConstNumber(value, result);
       }
       return new ConstLatticeElement(newConst);
diff --git a/src/main/java/com/android/tools/r8/ir/code/Phi.java b/src/main/java/com/android/tools/r8/ir/code/Phi.java
index 16fc789..eecf8c3 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Phi.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Phi.java
@@ -393,7 +393,7 @@
 
   // Type of phi(v1, v2, ..., vn) is the least upper bound of all those n operands.
   public TypeLatticeElement computePhiType(AppView<?> appView) {
-    TypeLatticeElement result = TypeLatticeElement.BOTTOM;
+    TypeLatticeElement result = TypeLatticeElement.getBottom();
     for (Value operand : getOperands()) {
       result = result.join(operand.getTypeLattice(), appView);
     }
@@ -416,7 +416,7 @@
       }
     }
     Set<Value> visitedOperands = Sets.newIdentityHashSet();
-    TypeLatticeElement result = TypeLatticeElement.BOTTOM;
+    TypeLatticeElement result = TypeLatticeElement.getBottom();
     for (Phi phi : reachablePhis) {
       for (Value operand : phi.getOperands()) {
         if (!operand.getAliasedValue().isPhi() && visitedOperands.add(operand)) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/StackValues.java b/src/main/java/com/android/tools/r8/ir/code/StackValues.java
index 1ce52f9..528cddd 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StackValues.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StackValues.java
@@ -16,7 +16,7 @@
   private final StackValue[] stackValues;
 
   public StackValues(StackValue... stackValues) {
-    super(Value.UNDEFINED_NUMBER, TypeLatticeElement.BOTTOM, null);
+    super(Value.UNDEFINED_NUMBER, TypeLatticeElement.getBottom(), null);
     this.stackValues = stackValues;
     assert stackValues.length >= 2;
   }
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 bba9148..8e75d62 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
@@ -79,9 +79,9 @@
         if (typeLattice.isTop()) {
           if (definition != null && definition.isConstNumber()) {
             assert definition.asConstNumber().isZero();
-            return TypeLatticeElement.NULL;
+            return TypeLatticeElement.getNull();
           } else {
-            return TypeLatticeElement.BOTTOM;
+            return TypeLatticeElement.getBottom();
           }
         }
         if (typeLattice.isReference()) {
@@ -98,17 +98,17 @@
         break;
       case INT:
         if (typeLattice.isTop() || (typeLattice.isSinglePrimitive() && !typeLattice.isFloat())) {
-          return TypeLatticeElement.INT;
+          return TypeLatticeElement.getInt();
         }
         break;
       case FLOAT:
         if (typeLattice.isTop() || (typeLattice.isSinglePrimitive() && !typeLattice.isInt())) {
-          return TypeLatticeElement.FLOAT;
+          return TypeLatticeElement.getFloat();
         }
         break;
       case INT_OR_FLOAT:
         if (typeLattice.isTop()) {
-          return TypeLatticeElement.SINGLE;
+          return TypeLatticeElement.getSingle();
         }
         if (typeLattice.isSinglePrimitive()) {
           return typeLattice;
@@ -116,12 +116,12 @@
         break;
       case LONG:
         if (typeLattice.isWidePrimitive() && !typeLattice.isDouble()) {
-          return TypeLatticeElement.LONG;
+          return TypeLatticeElement.getLong();
         }
         break;
       case DOUBLE:
         if (typeLattice.isWidePrimitive() && !typeLattice.isLong()) {
-          return TypeLatticeElement.DOUBLE;
+          return TypeLatticeElement.getDouble();
         }
         break;
       case LONG_OR_DOUBLE:
@@ -213,7 +213,7 @@
   public static final int UNDEFINED_NUMBER = -1;
 
   public static final Value UNDEFINED =
-      new Value(UNDEFINED_NUMBER, TypeLatticeElement.BOTTOM, null);
+      new Value(UNDEFINED_NUMBER, TypeLatticeElement.getBottom(), null);
 
   protected final int number;
   public Instruction definition = null;
@@ -232,6 +232,7 @@
   protected TypeLatticeElement typeLattice;
 
   public Value(int number, TypeLatticeElement typeLattice, DebugLocalInfo local) {
+    assert typeLattice != null;
     this.number = number;
     this.debugData = local == null ? null : new DebugData(local);
     this.typeLattice = typeLattice;
@@ -1101,6 +1102,7 @@
    * @param newType The new type lattice element
    */
   public void setTypeLattice(TypeLatticeElement newType) {
+    assert newType != null;
     typeLattice = newType;
   }
 
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 e3926c5..865c7d4 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
@@ -124,13 +124,13 @@
   public PrimitiveTypeLatticeElement toPrimitiveTypeLattice() {
     switch (this) {
       case INT:
-        return TypeLatticeElement.INT;
+        return TypeLatticeElement.getInt();
       case FLOAT:
-        return TypeLatticeElement.FLOAT;
+        return TypeLatticeElement.getFloat();
       case LONG:
-        return TypeLatticeElement.LONG;
+        return TypeLatticeElement.getLong();
       case DOUBLE:
-        return TypeLatticeElement.DOUBLE;
+        return TypeLatticeElement.getDouble();
       default:
         throw new Unreachable("Unexpected type in conversion to primitive: " + this);
     }
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 eb0ba83..1f7f97b 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
@@ -160,13 +160,13 @@
   public PrimitiveTypeLatticeElement toPrimitiveTypeLattice() {
     switch (this) {
       case INT:
-        return TypeLatticeElement.INT;
+        return TypeLatticeElement.getInt();
       case FLOAT:
-        return TypeLatticeElement.FLOAT;
+        return TypeLatticeElement.getFloat();
       case LONG:
-        return TypeLatticeElement.LONG;
+        return TypeLatticeElement.getLong();
       case DOUBLE:
-        return TypeLatticeElement.DOUBLE;
+        return TypeLatticeElement.getDouble();
       default:
         throw new Unreachable("Unexpected type in conversion to primitive: " + this);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
index 682804e..83ffaeb 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
@@ -385,7 +385,7 @@
             || constNumber == null
             || add == null
             || store == null
-            || constNumber.outValue().getTypeLattice() != TypeLatticeElement.INT) {
+            || constNumber.outValue().getTypeLattice() != TypeLatticeElement.getInt()) {
           it.next();
           continue;
         }
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 4dbdde6..42728d4 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
@@ -6,6 +6,14 @@
 
 import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNull;
 import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getBottom;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getDouble;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getFloat;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getInt;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getLong;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getNull;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getSingle;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getWide;
 
 import com.android.tools.r8.ApiLevelException;
 import com.android.tools.r8.errors.CompilationError;
@@ -139,12 +147,6 @@
  */
 public class IRBuilder {
 
-  private static final TypeLatticeElement INT = TypeLatticeElement.INT;
-  private static final TypeLatticeElement FLOAT = TypeLatticeElement.FLOAT;
-  private static final TypeLatticeElement LONG = TypeLatticeElement.LONG;
-  private static final TypeLatticeElement DOUBLE = TypeLatticeElement.DOUBLE;
-  private static final TypeLatticeElement NULL = TypeLatticeElement.NULL;
-
   public static final int INITIAL_BLOCK_OFFSET = -1;
 
   private static TypeLatticeElement fromMemberType(MemberType type) {
@@ -153,20 +155,20 @@
       case CHAR:
       case SHORT:
       case INT:
-        return INT;
+        return getInt();
       case FLOAT:
-        return FLOAT;
+        return getFloat();
       case INT_OR_FLOAT:
-        return TypeLatticeElement.SINGLE;
+        return getSingle();
       case LONG:
-        return LONG;
+        return getLong();
       case DOUBLE:
-        return DOUBLE;
+        return getDouble();
       case LONG_OR_DOUBLE:
-        return TypeLatticeElement.WIDE;
+        return getWide();
       case OBJECT:
         // For object types, we delay the exact type computation until done building.
-        return TypeLatticeElement.BOTTOM;
+        return getBottom();
       default:
         throw new Unreachable("Unexpected member type: " + type);
     }
@@ -895,7 +897,7 @@
     RemovedArgumentInfo removedArgumentInfo = getRemovedArgumentInfo();
     if (removedArgumentInfo == null) {
       DebugLocalInfo local = getOutgoingLocal(register);
-      Value value = writeRegister(register, INT, ThrowingInfo.NO_THROW, local);
+      Value value = writeRegister(register, getInt(), ThrowingInfo.NO_THROW, local);
       addNonThisArgument(new Argument(value, true));
     } else {
       assert removedArgumentInfo.isNeverUsed();
@@ -922,7 +924,7 @@
         pendingArgumentInstructions = new ArrayList<>();
       }
       DebugLocalInfo local = getOutgoingLocal(register);
-      Value value = writeRegister(register, TypeLatticeElement.NULL, ThrowingInfo.NO_THROW, local);
+      Value value = writeRegister(register, getNull(), ThrowingInfo.NO_THROW, local);
       pendingArgumentInstructions.add(new ConstNumber(value, 0));
     } else {
       assert removedArgumentInfo.isNeverUsed();
@@ -1049,7 +1051,7 @@
 
   public void addArrayLength(int dest, int array) {
     Value in = readRegister(array, ValueTypeConstraint.OBJECT);
-    Value out = writeRegister(dest, INT, ThrowingInfo.CAN_THROW);
+    Value out = writeRegister(dest, getInt(), ThrowingInfo.CAN_THROW);
     ArrayLength instruction = new ArrayLength(out, in);
     assert instruction.instructionTypeCanThrow();
     add(instruction);
@@ -1079,7 +1081,7 @@
   public void addCmp(NumericType type, Bias bias, int dest, int left, int right) {
     Value in1 = readNumericRegister(left, type);
     Value in2 = readNumericRegister(right, type);
-    Value out = writeRegister(dest, INT, ThrowingInfo.NO_THROW);
+    Value out = writeRegister(dest, getInt(), ThrowingInfo.NO_THROW);
     Cmp instruction = new Cmp(type, bias, out, in1, in2);
     assert !instruction.instructionTypeCanThrow();
     add(instruction);
@@ -1093,23 +1095,23 @@
   }
 
   public void addLongConst(int dest, long value) {
-    add(new ConstNumber(writeRegister(dest, LONG, ThrowingInfo.NO_THROW), value));
+    add(new ConstNumber(writeRegister(dest, getLong(), ThrowingInfo.NO_THROW), value));
   }
 
   public void addDoubleConst(int dest, long value) {
-    add(new ConstNumber(writeRegister(dest, DOUBLE, ThrowingInfo.NO_THROW), value));
+    add(new ConstNumber(writeRegister(dest, getDouble(), ThrowingInfo.NO_THROW), value));
   }
 
   public void addIntConst(int dest, long value) {
-    add(new ConstNumber(writeRegister(dest, INT, ThrowingInfo.NO_THROW), value));
+    add(new ConstNumber(writeRegister(dest, getInt(), ThrowingInfo.NO_THROW), value));
   }
 
   public void addFloatConst(int dest, long value) {
-    add(new ConstNumber(writeRegister(dest, FLOAT, ThrowingInfo.NO_THROW), value));
+    add(new ConstNumber(writeRegister(dest, getFloat(), ThrowingInfo.NO_THROW), value));
   }
 
   public void addNullConst(int dest) {
-    add(new ConstNumber(writeRegister(dest, NULL, ThrowingInfo.NO_THROW), 0L));
+    add(new ConstNumber(writeRegister(dest, getNull(), ThrowingInfo.NO_THROW), 0L));
   }
 
   public void addConstClass(int dest, DexType type) {
@@ -1377,7 +1379,7 @@
 
   public void addInstanceOf(int dest, int value, DexType type) {
     Value in = readRegister(value, ValueTypeConstraint.OBJECT);
-    Value out = writeRegister(dest, INT, ThrowingInfo.CAN_THROW);
+    Value out = writeRegister(dest, getInt(), ThrowingInfo.CAN_THROW);
     InstanceOf instruction = new InstanceOf(out, in, type);
     assert instruction.instructionTypeCanThrow();
     addInstruction(instruction);
@@ -2117,9 +2119,7 @@
     // A debug initiated value must have a precise type constraint.
     assert typeConstraint.isPrecise();
     TypeLatticeElement type =
-        typeConstraint.isObject()
-            ? TypeLatticeElement.NULL
-            : typeConstraint.toPrimitiveTypeLattice();
+        typeConstraint.isObject() ? getNull() : typeConstraint.toPrimitiveTypeLattice();
     if (uninitializedDebugLocalValues == null) {
       uninitializedDebugLocalValues = new Int2ReferenceOpenHashMap<>();
     }
@@ -2156,14 +2156,14 @@
   }
 
   private Value readLongLiteral(long constant) {
-    Value value = new Value(valueNumberGenerator.next(), LONG, null);
+    Value value = new Value(valueNumberGenerator.next(), getLong(), null);
     ConstNumber number = new ConstNumber(value, constant);
     add(number);
     return number.outValue();
   }
 
   private Value readIntLiteral(long constant) {
-    Value value = new Value(valueNumberGenerator.next(), INT, null);
+    Value value = new Value(valueNumberGenerator.next(), getInt(), null);
     ConstNumber number = new ConstNumber(value, constant);
     add(number);
     return number.outValue();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 4f84235..2c9a53c 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -1831,7 +1831,7 @@
     Instruction check = it.previous();
     assert addBefore == check;
     // Forced definition of const-zero
-    Value fixitValue = code.createValue(TypeLatticeElement.INT);
+    Value fixitValue = code.createValue(TypeLatticeElement.getInt());
     Instruction fixitDefinition = new AlwaysMaterializingDefinition(fixitValue);
     fixitDefinition.setBlock(addBefore.getBlock());
     fixitDefinition.setPosition(addBefore.getPosition());
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
index b54b406..41f22a4 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
@@ -107,7 +107,7 @@
       InvokeVirtual invokeInstruction =
           new InvokeVirtual(
               appView.dexItemFactory().stringMethods.equals,
-              code.createValue(PrimitiveTypeLatticeElement.INT),
+              code.createValue(PrimitiveTypeLatticeElement.getInt()),
               ImmutableList.of(theSwitch.value(), constStringInstruction.outValue()));
       invokeInstruction.setPosition(Position.syntheticNone());
 
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java b/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
index 6f01dd7..2c41a2a 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
@@ -68,25 +68,25 @@
   public static TypeLatticeElement typeForConstraint(ValueTypeConstraint constraint) {
     switch (constraint) {
       case INT_OR_FLOAT_OR_OBJECT:
-        return TypeLatticeElement.TOP;
+        return TypeLatticeElement.getTop();
       case OBJECT:
         // If the constraint is object the concrete lattice type will need to be computed.
         // We mark the object type as bottom for now, with the implication that it is of type
         // reference but that it should not contribute to the computation of its join
         // (in potentially self-referencing phis).
-        return TypeLatticeElement.BOTTOM;
+        return TypeLatticeElement.getBottom();
       case INT:
-        return TypeLatticeElement.INT;
+        return TypeLatticeElement.getInt();
       case FLOAT:
-        return TypeLatticeElement.FLOAT;
+        return TypeLatticeElement.getFloat();
       case INT_OR_FLOAT:
-        return TypeLatticeElement.SINGLE;
+        return TypeLatticeElement.getSingle();
       case LONG:
-        return TypeLatticeElement.LONG;
+        return TypeLatticeElement.getLong();
       case DOUBLE:
-        return TypeLatticeElement.DOUBLE;
+        return TypeLatticeElement.getDouble();
       case LONG_OR_DOUBLE:
-        return TypeLatticeElement.WIDE;
+        return TypeLatticeElement.getWide();
       default:
         throw new Unreachable("Unexpected constraint type: " + constraint);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 65e86b7..51fe0fe 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -1477,7 +1477,7 @@
           new ConstNumber(
               new Value(
                   code.valueNumberGenerator.next(),
-                  TypeLatticeElement.INT,
+                  TypeLatticeElement.getInt(),
                   instanceOf.outValue().getLocalInfo()),
               result == InstanceOfResult.TRUE ? 1 : 0);
       it.replaceCurrentInstruction(newInstruction);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/ClassInitializerSourceCode.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/ClassInitializerSourceCode.java
index c6aecbb..b679383 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/ClassInitializerSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/ClassInitializerSourceCode.java
@@ -47,7 +47,7 @@
           if (group.isSingletonLambda(lambda)) {
             int id = group.lambdaId(lambda);
             add(builder -> builder.addNewInstance(instance, groupClassType));
-            add(builder -> builder.addConst(TypeLatticeElement.INT, lambdaId, id));
+            add(builder -> builder.addConst(TypeLatticeElement.getInt(), lambdaId, id));
             add(
                 builder ->
                     builder.addInvoke(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
index 9e07c44..49eaa46 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
@@ -232,7 +232,7 @@
     @Override
     void prepareSuperConstructorCall(int receiverRegister) {
       int arityRegister = nextRegister(ValueType.INT);
-      add(builder -> builder.addConst(TypeLatticeElement.INT, arityRegister, arity));
+      add(builder -> builder.addConst(TypeLatticeElement.getInt(), arityRegister, arity));
       add(
           builder ->
               builder.addInvoke(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupCodeStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupCodeStrategy.java
index f17535a..e54d241 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupCodeStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupCodeStrategy.java
@@ -213,7 +213,7 @@
     DexType lambda = method.holder;
 
     // Create constant with lambda id.
-    Value lambdaIdValue = context.code.createValue(TypeLatticeElement.INT);
+    Value lambdaIdValue = context.code.createValue(TypeLatticeElement.getInt());
     ConstNumber lambdaId = new ConstNumber(lambdaIdValue, group.lambdaId(lambda));
     lambdaId.setPosition(invoke.getPosition());
     context.instructions().previous();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/MoveLoadUpPeephole.java b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/MoveLoadUpPeephole.java
index c50791e..49a74d1 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/MoveLoadUpPeephole.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/MoveLoadUpPeephole.java
@@ -113,7 +113,7 @@
     Instruction current = it.next();
     if (position != current.getPosition()
         || !current.isConstNumber()
-        || current.outValue().getTypeLattice() != TypeLatticeElement.INT
+        || current.outValue().getTypeLattice() != TypeLatticeElement.getInt()
         || current.asConstNumber().getIntValue() < -128
         || current.asConstNumber().getIntValue() > 127
         || !it.hasNext()) {
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 4b0d1ed..e53db5e 100644
--- a/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
+++ b/src/test/java/com/android/tools/r8/ir/SplitBlockTest.java
@@ -364,9 +364,9 @@
       // Modify the code to make the inserted block add the constant 10 to the original return
       // value.
       Value newConstValue =
-          new Value(test.valueNumberGenerator.next(), TypeLatticeElement.INT, null);
+          new Value(test.valueNumberGenerator.next(), TypeLatticeElement.getInt(), null);
       Value newReturnValue =
-          new Value(test.valueNumberGenerator.next(), TypeLatticeElement.INT, null);
+          new Value(test.valueNumberGenerator.next(), TypeLatticeElement.getInt(), null);
       Value oldReturnValue = newReturnBlock.iterator().next().asReturn().returnValue();
       newReturnBlock.iterator().next().asReturn().returnValue().replaceUsers(newReturnValue);
       Instruction constInstruction = new ConstNumber(newConstValue, 10);
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/ArrayTypeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/ArrayTypeTest.java
index e5e0a86..74a49ed 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/ArrayTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/ArrayTypeTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.ir.analysis.type;
 
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.FLOAT;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.INT;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getFloat;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getInt;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -74,8 +74,8 @@
           ArrayTypeLatticeElement arrayType = array.getTypeLattice().asArrayTypeLatticeElement();
           TypeLatticeElement elementType = arrayType.getArrayMemberTypeAsMemberType();
 
-          assertEquals(FLOAT, elementType);
-          assertEquals(FLOAT, value.getTypeLattice());
+          assertEquals(getFloat(), elementType);
+          assertEquals(getFloat(), value.getTypeLattice());
         }
       }
     };
@@ -94,8 +94,8 @@
         ArrayTypeLatticeElement arrayType = array.getTypeLattice().asArrayTypeLatticeElement();
         TypeLatticeElement elementType = arrayType.getArrayMemberTypeAsMemberType();
 
-        assertEquals(FLOAT, elementType);
-        assertEquals(FLOAT, value.getTypeLattice());
+        assertEquals(getFloat(), elementType);
+        assertEquals(getFloat(), value.getTypeLattice());
       }
 
       {
@@ -104,7 +104,7 @@
                 code,
                 instruction ->
                     instruction.isConstNumber() && instruction.asConstNumber().getRawValue() != 0);
-        assertEquals(FLOAT, constNumberInstruction.outValue().getTypeLattice());
+        assertEquals(getFloat(), constNumberInstruction.outValue().getTypeLattice());
       }
     };
   }
@@ -115,7 +115,7 @@
       for (BasicBlock block : code.blocks) {
         for (Phi phi : block.getPhis()) {
           phiCount++;
-          assertEquals(INT, phi.getTypeLattice());
+          assertEquals(getInt(), phi.getTypeLattice());
         }
       }
       assertEquals(2, phiCount);
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/ConstrainedPrimitiveTypeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/ConstrainedPrimitiveTypeTest.java
index dd0b5e2..9471d46 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/ConstrainedPrimitiveTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/ConstrainedPrimitiveTypeTest.java
@@ -4,10 +4,10 @@
 
 package com.android.tools.r8.ir.analysis.type;
 
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.DOUBLE;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.FLOAT;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.INT;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.LONG;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getDouble;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getFloat;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getInt;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getLong;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverInline;
@@ -54,42 +54,42 @@
 
   @Test
   public void testIntWithInvokeUser() throws Exception {
-    buildAndCheckIR("intWithInvokeUserTest", testInspector(INT, 1));
+    buildAndCheckIR("intWithInvokeUserTest", testInspector(getInt(), 1));
   }
 
   @Test
   public void testIntWithIndirectInvokeUser() throws Exception {
-    buildAndCheckIR("intWithIndirectInvokeUserTest", testInspector(INT, 2));
+    buildAndCheckIR("intWithIndirectInvokeUserTest", testInspector(getInt(), 2));
   }
 
   @Test
   public void testFloatWithInvokeUser() throws Exception {
-    buildAndCheckIR("floatWithInvokeUserTest", testInspector(FLOAT, 1));
+    buildAndCheckIR("floatWithInvokeUserTest", testInspector(getFloat(), 1));
   }
 
   @Test
   public void testFloatWithIndirectInvokeUser() throws Exception {
-    buildAndCheckIR("floatWithIndirectInvokeUserTest", testInspector(FLOAT, 2));
+    buildAndCheckIR("floatWithIndirectInvokeUserTest", testInspector(getFloat(), 2));
   }
 
   @Test
   public void testLongWithInvokeUser() throws Exception {
-    buildAndCheckIR("longWithInvokeUserTest", testInspector(LONG, 1));
+    buildAndCheckIR("longWithInvokeUserTest", testInspector(getLong(), 1));
   }
 
   @Test
   public void testLongWithIndirectInvokeUser() throws Exception {
-    buildAndCheckIR("longWithIndirectInvokeUserTest", testInspector(LONG, 2));
+    buildAndCheckIR("longWithIndirectInvokeUserTest", testInspector(getLong(), 2));
   }
 
   @Test
   public void testDoubleWithInvokeUser() throws Exception {
-    buildAndCheckIR("doubleWithInvokeUserTest", testInspector(DOUBLE, 1));
+    buildAndCheckIR("doubleWithInvokeUserTest", testInspector(getDouble(), 1));
   }
 
   @Test
   public void testDoubleWithIndirectInvokeUser() throws Exception {
-    buildAndCheckIR("doubleWithIndirectInvokeUserTest", testInspector(DOUBLE, 2));
+    buildAndCheckIR("doubleWithIndirectInvokeUserTest", testInspector(getDouble(), 2));
   }
 
   private static Consumer<IRCode> testInspector(
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
index b994eea..198ffa3 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
@@ -58,10 +58,10 @@
 @RunWith(Parameterized.class)
 public class TypeAnalysisTest extends SmaliTestBase {
   private static final InternalOptions TEST_OPTIONS = new InternalOptions();
-  private static final TypeLatticeElement NULL = TypeLatticeElement.NULL;
-  private static final TypeLatticeElement SINGLE = TypeLatticeElement.SINGLE;
-  private static final TypeLatticeElement INT = TypeLatticeElement.INT;
-  private static final TypeLatticeElement LONG = TypeLatticeElement.LONG;
+  private static final TypeLatticeElement NULL = TypeLatticeElement.getNull();
+  private static final TypeLatticeElement SINGLE = TypeLatticeElement.getSingle();
+  private static final TypeLatticeElement INT = TypeLatticeElement.getInt();
+  private static final TypeLatticeElement LONG = TypeLatticeElement.getLong();
 
   private final String dirName;
   private final String smaliFileName;
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeConstraintOnTrivialPhiTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeConstraintOnTrivialPhiTest.java
index ad428dd..80d752e 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeConstraintOnTrivialPhiTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeConstraintOnTrivialPhiTest.java
@@ -4,10 +4,6 @@
 
 package com.android.tools.r8.ir.analysis.type;
 
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.DOUBLE;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.FLOAT;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.INT;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.LONG;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
@@ -94,22 +90,24 @@
 
   @Test
   public void testIntConstraintOnTrivialPhi() throws Exception {
-    buildAndCheckIR("intConstraintOnTrivialPhiTest", testInspector(INT));
+    buildAndCheckIR("intConstraintOnTrivialPhiTest", testInspector(TypeLatticeElement.getInt()));
   }
 
   @Test
   public void testFloatConstraintOnTrivialPhi() throws Exception {
-    buildAndCheckIR("floatConstraintOnTrivialPhiTest", testInspector(FLOAT));
+    buildAndCheckIR(
+        "floatConstraintOnTrivialPhiTest", testInspector(TypeLatticeElement.getFloat()));
   }
 
   @Test
   public void testLongConstraintOnTrivialPhi() throws Exception {
-    buildAndCheckIR("longConstraintOnTrivialPhiTest", testInspector(LONG));
+    buildAndCheckIR("longConstraintOnTrivialPhiTest", testInspector(TypeLatticeElement.getLong()));
   }
 
   @Test
   public void testDoubleConstraintOnTrivialPhi() throws Exception {
-    buildAndCheckIR("doubleConstraintOnTrivialPhiTest", testInspector(DOUBLE));
+    buildAndCheckIR(
+        "doubleConstraintOnTrivialPhiTest", testInspector(TypeLatticeElement.getDouble()));
   }
 
   private static Consumer<IRCode> testInspector(TypeLatticeElement expectedType) {
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
index d6b9598..f2a20a6 100644
--- 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
@@ -18,8 +18,7 @@
   @Test
   public void testArrayWidth() {
     ArrayTypeLatticeElement arrayType =
-        ArrayTypeLatticeElement.create(
-            IntTypeLatticeElement.getInstance(), Nullability.maybeNull());
+        ArrayTypeLatticeElement.create(TypeLatticeElement.getInt(), Nullability.maybeNull());
     assertFalse(arrayType.isSinglePrimitive());
     assertFalse(arrayType.isWidePrimitive());
     assertEquals(1, arrayType.requiredRegisters());
@@ -27,51 +26,51 @@
 
   @Test
   public void testBooleanWidth() {
-    assertTrue(BooleanTypeLatticeElement.getInstance().isSinglePrimitive());
-    assertFalse(BooleanTypeLatticeElement.getInstance().isWidePrimitive());
-    assertEquals(1, BooleanTypeLatticeElement.getInstance().requiredRegisters());
+    assertTrue(TypeLatticeElement.getBoolean().isSinglePrimitive());
+    assertFalse(TypeLatticeElement.getBoolean().isWidePrimitive());
+    assertEquals(1, TypeLatticeElement.getBoolean().requiredRegisters());
   }
 
   @Test
   public void testByteWidth() {
-    assertTrue(ByteTypeLatticeElement.getInstance().isSinglePrimitive());
-    assertFalse(ByteTypeLatticeElement.getInstance().isWidePrimitive());
-    assertEquals(1, ByteTypeLatticeElement.getInstance().requiredRegisters());
+    assertTrue(TypeLatticeElement.getByte().isSinglePrimitive());
+    assertFalse(TypeLatticeElement.getByte().isWidePrimitive());
+    assertEquals(1, TypeLatticeElement.getByte().requiredRegisters());
   }
 
   @Test
   public void testCharWidth() {
-    assertTrue(CharTypeLatticeElement.getInstance().isSinglePrimitive());
-    assertFalse(CharTypeLatticeElement.getInstance().isWidePrimitive());
-    assertEquals(1, CharTypeLatticeElement.getInstance().requiredRegisters());
+    assertTrue(TypeLatticeElement.getChar().isSinglePrimitive());
+    assertFalse(TypeLatticeElement.getChar().isWidePrimitive());
+    assertEquals(1, TypeLatticeElement.getChar().requiredRegisters());
   }
 
   @Test
   public void testDoubleWidth() {
-    assertTrue(DoubleTypeLatticeElement.getInstance().isWidePrimitive());
-    assertFalse(DoubleTypeLatticeElement.getInstance().isSinglePrimitive());
-    assertEquals(2, DoubleTypeLatticeElement.getInstance().requiredRegisters());
+    assertTrue(TypeLatticeElement.getDouble().isWidePrimitive());
+    assertFalse(TypeLatticeElement.getDouble().isSinglePrimitive());
+    assertEquals(2, TypeLatticeElement.getDouble().requiredRegisters());
   }
 
   @Test
   public void testFloatWidth() {
-    assertTrue(FloatTypeLatticeElement.getInstance().isSinglePrimitive());
-    assertFalse(FloatTypeLatticeElement.getInstance().isWidePrimitive());
-    assertEquals(1, FloatTypeLatticeElement.getInstance().requiredRegisters());
+    assertTrue(TypeLatticeElement.getFloat().isSinglePrimitive());
+    assertFalse(TypeLatticeElement.getFloat().isWidePrimitive());
+    assertEquals(1, TypeLatticeElement.getFloat().requiredRegisters());
   }
 
   @Test
   public void testIntWidth() {
-    assertTrue(IntTypeLatticeElement.getInstance().isSinglePrimitive());
-    assertFalse(IntTypeLatticeElement.getInstance().isWidePrimitive());
-    assertEquals(1, IntTypeLatticeElement.getInstance().requiredRegisters());
+    assertTrue(TypeLatticeElement.getInt().isSinglePrimitive());
+    assertFalse(TypeLatticeElement.getInt().isWidePrimitive());
+    assertEquals(1, TypeLatticeElement.getInt().requiredRegisters());
   }
 
   @Test
   public void testLongWidth() {
-    assertTrue(LongTypeLatticeElement.getInstance().isWidePrimitive());
-    assertFalse(LongTypeLatticeElement.getInstance().isSinglePrimitive());
-    assertEquals(2, LongTypeLatticeElement.getInstance().requiredRegisters());
+    assertTrue(TypeLatticeElement.getLong().isWidePrimitive());
+    assertFalse(TypeLatticeElement.getLong().isSinglePrimitive());
+    assertEquals(2, TypeLatticeElement.getLong().requiredRegisters());
   }
 
   @Test
@@ -87,8 +86,8 @@
 
   @Test
   public void testShortWidth() {
-    assertTrue(ShortTypeLatticeElement.getInstance().isSinglePrimitive());
-    assertFalse(ShortTypeLatticeElement.getInstance().isWidePrimitive());
-    assertEquals(1, ShortTypeLatticeElement.getInstance().requiredRegisters());
+    assertTrue(TypeLatticeElement.getShort().isSinglePrimitive());
+    assertFalse(TypeLatticeElement.getShort().isWidePrimitive());
+    assertEquals(1, TypeLatticeElement.getShort().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 8f9b876..e0465b3 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
@@ -4,9 +4,9 @@
 package com.android.tools.r8.ir.analysis.type;
 
 import static com.android.tools.r8.ir.analysis.type.ClassTypeLatticeElement.computeLeastUpperBoundOfInterfaces;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.BOTTOM;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.TOP;
 import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.fromDexType;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getBottom;
+import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.getTop;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -64,19 +64,19 @@
   }
 
   private TopTypeLatticeElement top() {
-    return TypeLatticeElement.TOP;
+    return getTop();
   }
 
   private BottomTypeLatticeElement bottom() {
-    return TypeLatticeElement.BOTTOM;
+    return getBottom();
   }
 
   private SinglePrimitiveTypeLatticeElement single() {
-    return TypeLatticeElement.SINGLE;
+    return TypeLatticeElement.getSingle();
   }
 
   private WidePrimitiveTypeLatticeElement wide() {
-    return TypeLatticeElement.WIDE;
+    return TypeLatticeElement.getWide();
   }
 
   private TypeLatticeElement element(DexType type) {
@@ -510,9 +510,7 @@
     assertTrue(strictlyLessThan(
         array(2, factory.objectType),
         array(1, factory.objectType)));
-    assertTrue(strictlyLessThan(
-        ReferenceTypeLatticeElement.getNullTypeLatticeElement(),
-        array(1, factory.classType)));
+    assertTrue(strictlyLessThan(TypeLatticeElement.getNull(), array(1, factory.classType)));
   }
 
   @Test
@@ -527,10 +525,10 @@
             element(factory.objectType, Nullability.maybeNull())));
     assertFalse(
         lessThanOrEqualUpToNullability(array(3, factory.stringType), array(4, factory.stringType)));
-    assertTrue(lessThanOrEqualUpToNullability(BOTTOM, element(factory.objectType)));
-    assertFalse(lessThanOrEqualUpToNullability(element(factory.objectType), BOTTOM));
-    assertFalse(lessThanOrEqualUpToNullability(TOP, element(factory.objectType)));
-    assertTrue(lessThanOrEqualUpToNullability(element(factory.objectType), TOP));
+    assertTrue(lessThanOrEqualUpToNullability(getBottom(), element(factory.objectType)));
+    assertFalse(lessThanOrEqualUpToNullability(element(factory.objectType), getBottom()));
+    assertFalse(lessThanOrEqualUpToNullability(getTop(), element(factory.objectType)));
+    assertTrue(lessThanOrEqualUpToNullability(element(factory.objectType), getTop()));
   }
 
   @Test
@@ -545,10 +543,10 @@
     assertFalse(lessThanOrEqual(nullableType, nonNullType));
 
     // Check that the class-type null is also more specific than nullableType.
-    assertTrue(strictlyLessThan(TypeLatticeElement.NULL, nullableType));
+    assertTrue(strictlyLessThan(TypeLatticeElement.getNull(), nullableType));
     assertTrue(
         strictlyLessThan(
-            TypeLatticeElement.NULL,
+            TypeLatticeElement.getNull(),
             nullableType.getOrCreateVariant(Nullability.definitelyNull())));
   }
 
@@ -556,7 +554,7 @@
   public void testNotNullOfNullGivesBottom() {
     assertEquals(
         Nullability.bottom(),
-        ReferenceTypeLatticeElement.NULL.asMeetWithNotNull().nullability());
+        ReferenceTypeLatticeElement.getNull().asMeetWithNotNull().nullability());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/UnconstrainedPrimitiveTypeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/UnconstrainedPrimitiveTypeTest.java
index 09c27ea..d08b323 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/UnconstrainedPrimitiveTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/UnconstrainedPrimitiveTypeTest.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.ir.analysis.type;
 
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.INT;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.LONG;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
@@ -88,27 +86,32 @@
 
   @Test
   public void testUnconstrainedSingleWithNoUsers() throws Exception {
-    buildAndCheckIR("unconstrainedSingleWithNoUsersTest", testInspector(INT, 1));
+    buildAndCheckIR(
+        "unconstrainedSingleWithNoUsersTest", testInspector(TypeLatticeElement.getInt(), 1));
   }
 
   @Test
   public void testUnconstrainedSingleWithIfUser() throws Exception {
-    buildAndCheckIR("unconstrainedSingleWithIfUserTest", testInspector(INT, 2));
+    buildAndCheckIR(
+        "unconstrainedSingleWithIfUserTest", testInspector(TypeLatticeElement.getInt(), 2));
   }
 
   @Test
   public void testUnconstrainedSingleWithIfZeroUser() throws Exception {
-    buildAndCheckIR("unconstrainedSingleWithIfZeroUserTest", testInspector(INT, 1));
+    buildAndCheckIR(
+        "unconstrainedSingleWithIfZeroUserTest", testInspector(IntTypeLatticeElement.getInt(), 1));
   }
 
   @Test
   public void testUnconstrainedWideWithNoUsers() throws Exception {
-    buildAndCheckIR("unconstrainedWideWithNoUsersTest", testInspector(LONG, 1));
+    buildAndCheckIR(
+        "unconstrainedWideWithNoUsersTest", testInspector(TypeLatticeElement.getLong(), 1));
   }
 
   @Test
   public void testUnconstrainedWideWithIfUser() throws Exception {
-    buildAndCheckIR("unconstrainedWideWithIfUserTest", testInspector(LONG, 2));
+    buildAndCheckIR(
+        "unconstrainedWideWithIfUserTest", testInspector(TypeLatticeElement.getLong(), 2));
   }
 
   private static Consumer<IRCode> testInspector(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
index 2d626a2..607839e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
@@ -76,14 +76,14 @@
     IRMetadata metadata = IRMetadata.unknown();
     Position position = Position.testingPosition();
 
-    Value v3 = new Value(3, TypeLatticeElement.LONG, null);
+    Value v3 = new Value(3, TypeLatticeElement.getLong(), null);
     v3.setNeedsRegister(true);
     new MockLiveIntervals(v3);
     Instruction instruction = new ConstNumber(v3, 0);
     instruction.setPosition(position);
     block.add(instruction, metadata);
 
-    Value v0 = new Value(0, TypeLatticeElement.LONG, null);
+    Value v0 = new Value(0, TypeLatticeElement.getLong(), null);
     v0.setNeedsRegister(true);
     new MockLiveIntervals(v0);
     instruction = new ConstNumber(v0, 10);
@@ -94,14 +94,14 @@
     instruction.setPosition(position);
     block.add(instruction, metadata);
 
-    Value v2 = new Value(2, TypeLatticeElement.INT, null);
+    Value v2 = new Value(2, TypeLatticeElement.getInt(), null);
     v2.setNeedsRegister(true);
     new MockLiveIntervals(v2);
     instruction = new ConstNumber(v2, 10);
     instruction.setPosition(position);
     block.add(instruction, metadata);
 
-    Value v1 = new Value(1, TypeLatticeElement.INT, null);
+    Value v1 = new Value(1, TypeLatticeElement.getInt(), null);
     v1.setNeedsRegister(true);
     new MockLiveIntervals(v1);
     instruction = new Move(v1 ,v2);
@@ -112,7 +112,7 @@
     instruction.setPosition(position);
     block.add(instruction, metadata);
 
-    Value v0_2 = new Value(0, TypeLatticeElement.LONG, null);
+    Value v0_2 = new Value(0, TypeLatticeElement.getLong(), null);
     v0_2.setNeedsRegister(true);
     new MockLiveIntervals(v0_2);
     instruction = new ConstNumber(v0_2, 10);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
index 0083b33..5d48fa6 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
@@ -59,7 +59,7 @@
     block2.setFilledForTesting();
     BasicBlock block1 = new BasicBlock();
     block1.setNumber(1);
-    Value value = new Value(0, TypeLatticeElement.INT, null);
+    Value value = new Value(0, TypeLatticeElement.getInt(), null);
     Instruction number = new ConstNumber(value, 0);
     number.setPosition(position);
     block1.add(number, metadata);
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 d5a89c8..00ee4e7 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
@@ -65,13 +65,13 @@
   @Test
   public void equalityOfConstantOperands() {
     RegisterAllocator allocator = new MockRegisterAllocator();
-    Value value0 = new Value(0, TypeLatticeElement.INT, null);
+    Value value0 = new Value(0, TypeLatticeElement.getInt(), null);
     ConstNumber const0 = new ConstNumber(value0, 0);
-    Value value1 = new Value(1, TypeLatticeElement.INT, null);
+    Value value1 = new Value(1, TypeLatticeElement.getInt(), null);
     ConstNumber const1 = new ConstNumber(value1, 1);
-    Value value2 = new Value(2, TypeLatticeElement.INT, null);
+    Value value2 = new Value(2, TypeLatticeElement.getInt(), null);
     ConstNumber const2 = new ConstNumber(value2, 2);
-    Value value3 = new Value(2, TypeLatticeElement.INT, null);
+    Value value3 = new Value(2, TypeLatticeElement.getInt(), null);
     Add add0 = new Add(NumericType.INT, value3, value0, value1);
     add0.setPosition(Position.none());
     Add add1 = new Add(NumericType.INT, value3, value0, value2);
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
index a449c5d..f88783d 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
@@ -161,8 +161,8 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(0, 1, TypeLatticeElement.INT));
-    scheduler.addMove(new RegisterMove(1, 0, TypeLatticeElement.INT));
+    scheduler.addMove(new RegisterMove(0, 1, TypeLatticeElement.getInt()));
+    scheduler.addMove(new RegisterMove(1, 0, TypeLatticeElement.getInt()));
     scheduler.schedule();
     assertEquals(3, moves.size());
     Move tempMove = moves.get(0);
@@ -186,8 +186,8 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(0, 2, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(2, 0, TypeLatticeElement.LONG));
+    scheduler.addMove(new RegisterMove(0, 2, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(2, 0, TypeLatticeElement.getLong()));
     scheduler.schedule();
     assertEquals(3, moves.size());
     Move tempMove = moves.get(0);
@@ -211,8 +211,8 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(1, 0, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(0, 1, TypeLatticeElement.INT));
+    scheduler.addMove(new RegisterMove(1, 0, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(0, 1, TypeLatticeElement.getInt()));
     scheduler.schedule();
     assertEquals(3, moves.size());
     Move tempMove = moves.get(0).asMove();
@@ -236,8 +236,8 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(0, 1, TypeLatticeElement.INT));
-    scheduler.addMove(new RegisterMove(1, 0, TypeLatticeElement.LONG));
+    scheduler.addMove(new RegisterMove(0, 1, TypeLatticeElement.getInt()));
+    scheduler.addMove(new RegisterMove(1, 0, TypeLatticeElement.getLong()));
     scheduler.schedule();
     assertEquals(3, moves.size());
     Move tempMove = moves.get(0).asMove();
@@ -261,8 +261,8 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(0, 1, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(2, 3, TypeLatticeElement.LONG));
+    scheduler.addMove(new RegisterMove(0, 1, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(2, 3, TypeLatticeElement.getLong()));
     scheduler.schedule();
     assertEquals(2, moves.size());
     Move firstMove = moves.get(0).asMove();
@@ -280,8 +280,8 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(2, 1, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(0, 3, TypeLatticeElement.LONG));
+    scheduler.addMove(new RegisterMove(2, 1, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(0, 3, TypeLatticeElement.getLong()));
     scheduler.schedule();
     assertEquals(3, moves.size());
     Move firstMove = moves.get(0).asMove();
@@ -303,9 +303,9 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(2, 0, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(0, 2, TypeLatticeElement.INT));
-    scheduler.addMove(new RegisterMove(1, 3, TypeLatticeElement.INT));
+    scheduler.addMove(new RegisterMove(2, 0, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(0, 2, TypeLatticeElement.getInt()));
+    scheduler.addMove(new RegisterMove(1, 3, TypeLatticeElement.getInt()));
     scheduler.schedule();
     assertEquals(4, moves.size());
     Move firstMove = moves.get(0).asMove();
@@ -327,8 +327,8 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(0, 2, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(3, 0, TypeLatticeElement.INT));
+    scheduler.addMove(new RegisterMove(0, 2, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(3, 0, TypeLatticeElement.getInt()));
     scheduler.schedule();
     assertEquals(3, moves.size());
     Move firstMove = moves.get(0).asMove();
@@ -350,10 +350,10 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(14, 11, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(16, 13, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(10, 17, TypeLatticeElement.LONG));
-    scheduler.addMove(new RegisterMove(12, 19, TypeLatticeElement.LONG));
+    scheduler.addMove(new RegisterMove(14, 11, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(16, 13, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(10, 17, TypeLatticeElement.getLong()));
+    scheduler.addMove(new RegisterMove(12, 19, TypeLatticeElement.getLong()));
     scheduler.schedule();
     // In order to resolve these moves, we need to use two temporary register pairs.
     assertEquals(6, moves.size());
@@ -375,10 +375,10 @@
     CollectMovesIterator moves = new CollectMovesIterator();
     int temp = 42;
     RegisterMoveScheduler scheduler = new RegisterMoveScheduler(moves, temp);
-    scheduler.addMove(new RegisterMove(26, 22, TypeLatticeElement.INT));
-    scheduler.addMove(new RegisterMove(29, 24, TypeLatticeElement.LONG));
+    scheduler.addMove(new RegisterMove(26, 22, TypeLatticeElement.getInt()));
+    scheduler.addMove(new RegisterMove(29, 24, TypeLatticeElement.getLong()));
     scheduler.addMove(new RegisterMove(28, 26, objectType));
-    scheduler.addMove(new RegisterMove(23, 28, TypeLatticeElement.LONG));
+    scheduler.addMove(new RegisterMove(23, 28, TypeLatticeElement.getLong()));
     scheduler.schedule();
     // For this example we need recursive unblocking.
     assertEquals(6, moves.size());
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/Regress68656641.java b/src/test/java/com/android/tools/r8/ir/regalloc/Regress68656641.java
index a5183d3..4700a44 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/Regress68656641.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/Regress68656641.java
@@ -63,20 +63,19 @@
     // Setup live an inactive live interval with ranges [0, 10[ and [20, 30[ with only
     // uses in the first interval and which is linked to another interval.
     LiveIntervals inactiveIntervals =
-        new LiveIntervals(new Value(0, TypeLatticeElement.INT, null));
+        new LiveIntervals(new Value(0, TypeLatticeElement.getInt(), null));
     inactiveIntervals.addRange(new LiveRange(0, 10));
     inactiveIntervals.addUse(new LiveIntervalsUse(0, 10));
     inactiveIntervals.addUse(new LiveIntervalsUse(4, 10));
     inactiveIntervals.addRange(new LiveRange(20, 30));
     inactiveIntervals.setRegister(0);
-    LiveIntervals linked =
-        new LiveIntervals(new Value(1, TypeLatticeElement.INT, null));
+    LiveIntervals linked = new LiveIntervals(new Value(1, TypeLatticeElement.getInt(), null));
     linked.setRegister(1);
     inactiveIntervals.link(linked);
     allocator.addInactiveIntervals(inactiveIntervals);
     // Setup an unhandled interval that overlaps the inactive interval.
     LiveIntervals unhandledIntervals =
-        new LiveIntervals(new Value(2, TypeLatticeElement.INT, null));
+        new LiveIntervals(new Value(2, TypeLatticeElement.getInt(), null));
     unhandledIntervals.addRange(new LiveRange(12, 24));
     // Split the overlapping inactive intervals and check that after the split, the second
     // part of the inactive interval is unhandled and will therefore get a new register