         ,    Literal.seven
         ,    Literal.eight
         ,    Literal.nine:
-            return decodeNumberExponentDigits(start, sign: sign, value: value, expSign: 1.0)
+            return decodeNumberExponentDigits(start, sign: sign, value: value, expSign: .Positive)
 
         case Literal.PLUS:
-            return decodeNumberExponentSign(start, sign: sign, value: value, expSign: 1.0)
+            return decodeNumberExponentSign(start, sign: sign, value: value, expSign: .Positive)
 
         case Literal.MINUS:
-            return decodeNumberExponentSign(start, sign: sign, value: value, expSign: -1.0)
+            return decodeNumberExponentSign(start, sign: sign, value: value, expSign: .Negative)
 
         default:
             return makeParseError("unexpected end of data while parsing number at position \(start)")
         }
     }
 
-    mutating func decodeNumberExponentSign(start: Int, sign: Double, value: Double, expSign: Double) -> Result {
+    mutating func decodeNumberExponentSign(start: Int, sign: Sign, value: Double, expSign: Sign) -> Result {
         if ++loc >= input.count {
             return makeParseError("unexpected end of data while parsing number at position \(start)")
         }

                return decodeNumberExponent(start, sign: sign, value: value)

            default:
                return .Ok(.Number(sign * value))
            }
        }
        return .Ok(.Number(sign * value))
    }

    mutating func decodeNumberExponent(start: Int, sign: Double, value: Double) -> Result {
        if ++loc >= input.count {
            return makeParseError("unexpected end of data while parsing number at position \(start)")
        }

        ,    Literal.seven
        ,    Literal.eight
        ,    Literal.nine:
            return decodeNumberPreDecimalDigits(start, sign: .Negative)

        default:
            return makeParseError("unexpected end of data while parsing number at position \(start)")
        }
    }

    mutating func decodeNumberLeadingZero(start: Int, sign: Sign) -> Result {
        if ++loc >= input.count {
            return .Ok(.Number(0))
        }
