public CachedReadConstantNode(RubyClass expectedClass, Object value, ReadConstantChainNode next) {
    this.expectedClass = expectedClass;
    unmodifiedAssumption = expectedClass.getUnmodifiedAssumption();

    this.value = value;

    /*
     * We could do this lazily as needed, but I'm sure the compiler will appreciate the fact
     * that these fields are all final.
     */

    if (value instanceof Boolean) {
      hasBoolean = true;
      booleanValue = (boolean) value;

      hasIntegerFixnum = false;
      integerFixnumValue = -1;

      hasLongFixnum = false;
      longFixnumValue = -1;

      hasFloat = false;
      floatValue = -1;
    } else if (value instanceof Integer) {
      hasBoolean = false;
      booleanValue = false;

      hasIntegerFixnum = true;
      integerFixnumValue = (int) value;

      hasLongFixnum = true;
      longFixnumValue = (int) value;

      hasFloat = true;
      floatValue = (int) value;
    } else if (value instanceof Long) {
      hasBoolean = false;
      booleanValue = false;

      if ((long) value <= Integer.MAX_VALUE) {
        hasIntegerFixnum = true;
        integerFixnumValue = (int) (long) value;
      } else {
        hasIntegerFixnum = false;
        integerFixnumValue = -1;
      }

      hasLongFixnum = true;
      longFixnumValue = (long) value;

      hasFloat = true;
      floatValue = (long) value;
    } else if (value instanceof Double) {
      hasBoolean = false;
      booleanValue = false;

      hasIntegerFixnum = false;
      integerFixnumValue = -1;

      hasLongFixnum = false;
      longFixnumValue = -1;

      hasFloat = true;
      floatValue = (double) value;
    } else {
      hasBoolean = false;
      booleanValue = false;

      hasIntegerFixnum = false;
      integerFixnumValue = -1;

      hasLongFixnum = false;
      longFixnumValue = -1;

      hasFloat = false;
      floatValue = -1;
    }

    this.next = next;
  }