Always use one of 2 pre-built ImmutableBooleanEncodedValue instances
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEncodedValue.java
index 2710f83..e086e6e 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEncodedValue.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEncodedValue.java
@@ -101,7 +101,7 @@
                     return ImmutableNullEncodedValue.INSTANCE;
                 case ValueType.BOOLEAN:
                     Preconditions.checkValueArg(valueArg, 1);
-                    return new ImmutableBooleanEncodedValue(valueArg == 1);
+                    return ImmutableBooleanEncodedValue.forBoolean(valueArg == 1);
                 default:
                     throw new ExceptionWithContext("Invalid encoded_value type: 0x%x", valueType);
             }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableBooleanEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableBooleanEncodedValue.java
index 4cd3388..beef8aa 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableBooleanEncodedValue.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableBooleanEncodedValue.java
@@ -35,17 +35,21 @@
 import org.jf.dexlib2.iface.value.BooleanEncodedValue;
 
 public class ImmutableBooleanEncodedValue extends BaseBooleanEncodedValue implements ImmutableEncodedValue {
+    public static final ImmutableBooleanEncodedValue TRUE_VALUE = new ImmutableBooleanEncodedValue(true);
+    public static final ImmutableBooleanEncodedValue FALSE_VALUE = new ImmutableBooleanEncodedValue(false);
+
     protected final boolean value;
 
-    public ImmutableBooleanEncodedValue(boolean value) {
+    private ImmutableBooleanEncodedValue(boolean value) {
         this.value = value;
     }
 
+    public static ImmutableBooleanEncodedValue forBoolean(boolean value) {
+        return value?TRUE_VALUE:FALSE_VALUE;
+    }
+
     public static ImmutableBooleanEncodedValue of(BooleanEncodedValue booleanEncodedValue) {
-        if (booleanEncodedValue instanceof ImmutableBooleanEncodedValue) {
-            return (ImmutableBooleanEncodedValue)booleanEncodedValue;
-        }
-        return new ImmutableBooleanEncodedValue(booleanEncodedValue.getValue());
+        return forBoolean(booleanEncodedValue.getValue());
     }
 
     @Override public boolean getValue() { return value; }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java
index 3473429..db5c84a 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java
@@ -87,7 +87,7 @@
     public static EncodedValue defaultValueForType(String type) {
         switch (type.charAt(0)) {
             case 'Z':
-                return new ImmutableBooleanEncodedValue(false);
+                return ImmutableBooleanEncodedValue.FALSE_VALUE;
             case 'B':
                 return new ImmutableByteEncodedValue((byte)0);
             case 'S':