diff --git i/src/phonenumberutil.js w/src/phonenumberutil.js
index 2b20e4a..952a639 100644
--- i/src/phonenumberutil.js
+++ w/src/phonenumberutil.js
@@ -2972,7 +2972,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.getCountryCodeForRegion =
  *     calling code for.
  * @return {number} the country calling code for the region denoted by
  *     regionCode.
- * @throws {string} if the region is invalid
+ * @throws {Error} if the region is invalid
  * @private
  */
 i18n.phonenumbers.PhoneNumberUtil.prototype.getCountryCodeForValidRegion_ =
@@ -2981,7 +2981,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.getCountryCodeForValidRegion_ =
   /** @type {i18n.phonenumbers.PhoneMetadata} */
   var metadata = this.getMetadataForRegion(regionCode);
   if (metadata == null) {
-    throw 'Invalid region code: ' + regionCode;
+    throw new Error('Invalid region code: ' + regionCode);
   }
   return metadata.getCountryCodeOrDefault();
 };
@@ -3348,7 +3348,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.extractCountryCode =
  *     only populated when keepCountryCodeSource is true.
  * @return {number} the country calling code extracted or 0 if none could be
  *     extracted.
- * @throws {i18n.phonenumbers.Error}
+ * @throws {Error}
  */
 i18n.phonenumbers.PhoneNumberUtil.prototype.maybeExtractCountryCode =
     function(number, defaultRegionMetadata, nationalNumber,
@@ -3379,7 +3379,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.maybeExtractCountryCode =
       i18n.phonenumbers.PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY) {
     if (fullNumber.getLength() <=
         i18n.phonenumbers.PhoneNumberUtil.MIN_LENGTH_FOR_NSN_) {
-      throw i18n.phonenumbers.Error.TOO_SHORT_AFTER_IDD;
+      throw new Error(i18n.phonenumbers.Error.TOO_SHORT_AFTER_IDD);
     }
     /** @type {number} */
     var potentialCountryCode = this.extractCountryCode(fullNumber,
@@ -3391,7 +3391,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.maybeExtractCountryCode =

     // If this fails, they must be using a strange country calling code that we
     // don't recognize, or that doesn't exist.
-    throw i18n.phonenumbers.Error.INVALID_COUNTRY_CODE;
+    throw new Error(i18n.phonenumbers.Error.INVALID_COUNTRY_CODE);
   } else if (defaultRegionMetadata != null) {
     // Check to see if the number starts with the country calling code for the
     // default region. If so, we remove the country calling code, and do some
@@ -3708,7 +3708,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.checkRegionForParsing_ = function(
  *     'ZZ' or null can be supplied.
  * @return {i18n.phonenumbers.PhoneNumber} a phone number proto buffer filled
  *     with the parsed number.
- * @throws {i18n.phonenumbers.Error} if the string is not considered to be a
+ * @throws {Error} if the string is not considered to be a
  *     viable phone number (e.g. too few or too many digits) or if no default
  *     region was supplied and the number is not in international format (does
  *     not start with +).
@@ -3733,7 +3733,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.parse = function(numberToParse,
  *     case would be stored as that of the default region supplied.
  * @return {i18n.phonenumbers.PhoneNumber} a phone number proto buffer filled
  *     with the parsed number.
- * @throws {i18n.phonenumbers.Error} if the string is not considered to be a
+ * @throws {Error} if the string is not considered to be a
  *     viable phone number or if no default region was supplied.
  */
 i18n.phonenumbers.PhoneNumberUtil.prototype.parseAndKeepRawInput =
@@ -3742,7 +3742,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.parseAndKeepRawInput =
   if (!this.isValidRegionCode_(defaultRegion)) {
     if (numberToParse.length > 0 && numberToParse.charAt(0) !=
         i18n.phonenumbers.PhoneNumberUtil.PLUS_SIGN) {
-      throw i18n.phonenumbers.Error.INVALID_COUNTRY_CODE;
+      throw new Error(i18n.phonenumbers.Error.INVALID_COUNTRY_CODE);
     }
   }
   return this.parseHelper_(numberToParse, defaultRegion, true, true);
@@ -3794,17 +3794,17 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.setItalianLeadingZerosForPhoneNumber
  *     the default coregion to be null or unknown ('ZZ').
  * @return {i18n.phonenumbers.PhoneNumber} a phone number proto buffer filled
  *     with the parsed number.
- * @throws {i18n.phonenumbers.Error}
+ * @throws {Error}
  * @private
  */
 i18n.phonenumbers.PhoneNumberUtil.prototype.parseHelper_ =
     function(numberToParse, defaultRegion, keepRawInput, checkRegion) {

   if (numberToParse == null) {
-    throw i18n.phonenumbers.Error.NOT_A_NUMBER;
+    throw new Error(i18n.phonenumbers.Error.NOT_A_NUMBER);
   } else if (numberToParse.length >
       i18n.phonenumbers.PhoneNumberUtil.MAX_INPUT_STRING_LENGTH_) {
-    throw i18n.phonenumbers.Error.TOO_LONG;
+    throw new Error(i18n.phonenumbers.Error.TOO_LONG);
   }

   /** @type {!goog.string.StringBuffer} */
@@ -3813,14 +3813,14 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.parseHelper_ =

   if (!i18n.phonenumbers.PhoneNumberUtil.isViablePhoneNumber(
       nationalNumber.toString())) {
-    throw i18n.phonenumbers.Error.NOT_A_NUMBER;
+    throw new Error(i18n.phonenumbers.Error.NOT_A_NUMBER);
   }

   // Check the region supplied is valid, or that the extracted number starts
   // with some sort of + sign so the number's region can be determined.
   if (checkRegion &&
       !this.checkRegionForParsing_(nationalNumber.toString(), defaultRegion)) {
-    throw i18n.phonenumbers.Error.INVALID_COUNTRY_CODE;
+    throw new Error(i18n.phonenumbers.Error.INVALID_COUNTRY_CODE);
   }

   /** @type {i18n.phonenumbers.PhoneNumber} */
@@ -3850,7 +3850,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.parseHelper_ =
     countryCode = this.maybeExtractCountryCode(nationalNumberStr,
         regionMetadata, normalizedNationalNumber, keepRawInput, phoneNumber);
   } catch (e) {
-    if (e == i18n.phonenumbers.Error.INVALID_COUNTRY_CODE &&
+    if (e.message == i18n.phonenumbers.Error.INVALID_COUNTRY_CODE &&
         i18n.phonenumbers.PhoneNumberUtil.LEADING_PLUS_CHARS_PATTERN_
             .test(nationalNumberStr)) {
       // Strip the plus-char, and try again.
@@ -3888,7 +3888,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.parseHelper_ =
   }
   if (normalizedNationalNumber.getLength() <
       i18n.phonenumbers.PhoneNumberUtil.MIN_LENGTH_FOR_NSN_) {
-    throw i18n.phonenumbers.Error.TOO_SHORT_NSN;
+    throw new Error(i18n.phonenumbers.Error.TOO_SHORT_NSN);
   }

   if (regionMetadata != null) {
@@ -3913,11 +3913,11 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.parseHelper_ =
   var lengthOfNationalNumber = normalizedNationalNumberStr.length;
   if (lengthOfNationalNumber <
       i18n.phonenumbers.PhoneNumberUtil.MIN_LENGTH_FOR_NSN_) {
-    throw i18n.phonenumbers.Error.TOO_SHORT_NSN;
+    throw new Error(i18n.phonenumbers.Error.TOO_SHORT_NSN);
   }
   if (lengthOfNationalNumber >
       i18n.phonenumbers.PhoneNumberUtil.MAX_LENGTH_FOR_NSN_) {
-    throw i18n.phonenumbers.Error.TOO_LONG;
+    throw new Error(i18n.phonenumbers.Error.TOO_LONG);
   }
   this.setItalianLeadingZerosForPhoneNumber_(
       normalizedNationalNumberStr, phoneNumber);
@@ -4041,7 +4041,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isNumberMatch =
       firstNumber = this.parse(
           firstNumberIn, i18n.phonenumbers.PhoneNumberUtil.UNKNOWN_REGION_);
     } catch (e) {
-      if (e != i18n.phonenumbers.Error.INVALID_COUNTRY_CODE) {
+      if (e.message != i18n.phonenumbers.Error.INVALID_COUNTRY_CODE) {
         return i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER;
       }
       // The first number has no country calling code. EXACT_MATCH is no longer
@@ -4085,7 +4085,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isNumberMatch =
           secondNumberIn, i18n.phonenumbers.PhoneNumberUtil.UNKNOWN_REGION_);
       return this.isNumberMatch(firstNumberIn, secondNumber);
     } catch (e) {
-      if (e != i18n.phonenumbers.Error.INVALID_COUNTRY_CODE) {
+      if (e.message != i18n.phonenumbers.Error.INVALID_COUNTRY_CODE) {
         return i18n.phonenumbers.PhoneNumberUtil.MatchType.NOT_A_NUMBER;
       }
       return this.isNumberMatch(secondNumberIn, firstNumber);
diff --git i/src/phonenumberutil_test.js w/src/phonenumberutil_test.js
index af37fc5..17f0e2e 100644
--- i/src/phonenumberutil_test.js
+++ w/src/phonenumberutil_test.js
@@ -2154,7 +2154,7 @@ function testMaybeExtractCountryCode() {
    // Expected.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }
  number = new i18n.phonenumbers.PhoneNumber();
  try {
@@ -2357,7 +2357,7 @@ function testParseMaliciousInput() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.TOO_LONG,
-                 e);
+                 e.message);
  }
  /** @type {!goog.string.StringBuffer} */
  var maliciousNumberWithAlmostExt = new goog.string.StringBuffer();
@@ -2373,7 +2373,7 @@ function testParseMaliciousInput() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.TOO_LONG,
-                 e);
+                 e.message);
  }
}
@@ -2543,7 +2543,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    sentencePhoneNumber = '1 Still not a number';
@@ -2554,7 +2554,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    sentencePhoneNumber = '1 MICROSOFT';
@@ -2565,7 +2565,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    sentencePhoneNumber = '12 MICROSOFT';
@@ -2576,7 +2576,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2588,7 +2588,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.TOO_LONG,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2600,7 +2600,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2611,7 +2611,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2623,7 +2623,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2635,7 +2635,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.TOO_SHORT_NSN,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2647,7 +2647,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2659,7 +2659,7 @@ function testFailedParseOnInvalidNumbers() {
    // country code.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2670,7 +2670,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }
  try {
    someNumber = '123 456 7890';
@@ -2680,7 +2680,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }
  try {
    someNumber = '123 456 7890';
@@ -2690,7 +2690,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }
  try {
    someNumber = '0044------';
@@ -2700,7 +2700,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.TOO_SHORT_AFTER_IDD,
-                 e);
+                 e.message);
  }
  try {
    someNumber = '0044';
@@ -2710,7 +2710,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.TOO_SHORT_AFTER_IDD,
-                 e);
+                 e.message);
  }
  try {
    someNumber = '011';
@@ -2720,7 +2720,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.TOO_SHORT_AFTER_IDD,
-                 e);
+                 e.message);
  }
  try {
    someNumber = '0119';
@@ -2730,7 +2730,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.TOO_SHORT_AFTER_IDD,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2742,7 +2742,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    // Invalid region.
@@ -2752,7 +2752,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    phoneUtil.parse(null, RegionCode.US);
@@ -2761,7 +2761,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.NOT_A_NUMBER,
-                 e);
+                 e.message);
  }
  try {
    /** @type {string} */
@@ -2772,7 +2772,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }
  try {
    // This is invalid because no '+' sign is present as part of phone-context.
@@ -2785,7 +2785,7 @@ function testFailedParseOnInvalidNumbers() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }
}

@@ -3015,7 +3015,7 @@ function testParseAndKeepRaw() {
    // Expected this exception.
    assertEquals('Wrong error type stored in exception.',
                 i18n.phonenumbers.Error.INVALID_COUNTRY_CODE,
-                 e);
+                 e.message);
  }

  /** @type {i18n.phonenumbers.PhoneNumber} */
