diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index 21c576e..fd7fecf 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -442,7 +442,7 @@
   Field* s8 = statics->GetStaticField(8);
   EXPECT_EQ('L', s8->GetType());
 //  EXPECT_TRUE(down_cast<String*>(s8->GetObject())->Equals("android"));  // TODO: uncomment this
-  s8->SetObject(String::AllocFromAscii("robot"));
+  s8->SetObject(String::AllocFromModifiedUtf8("robot"));
 
   Field* s9 = statics->GetStaticField(9);
   EXPECT_EQ('[', s9->GetType());
diff --git a/src/intern_table_test.cc b/src/intern_table_test.cc
index e6bb611..662a8b6 100644
--- a/src/intern_table_test.cc
+++ b/src/intern_table_test.cc
@@ -15,7 +15,7 @@
   InternTable intern_table;
   String* foo_1 = intern_table.Intern(3, "foo");
   String* foo_2 = intern_table.Intern(3, "foo");
-  String* foo_3 = String::AllocFromAscii("foo");
+  String* foo_3 = String::AllocFromModifiedUtf8("foo");
   String* bar = intern_table.Intern(3, "bar");
   EXPECT_TRUE(foo_1->Equals("foo"));
   EXPECT_TRUE(foo_2->Equals("foo"));
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 586b541..fd66d73 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -1741,8 +1741,7 @@
   if (utf == NULL) {
     return NULL;
   }
-  size_t char_count = String::ModifiedUtf8Len(utf);
-  String* result = String::AllocFromModifiedUtf8(char_count, utf);
+  String* result = String::AllocFromModifiedUtf8(utf);
   return AddLocalReference<jstring>(ts, result);
 }
 
diff --git a/src/object.h b/src/object.h
index 1789ec8..2384fde 100644
--- a/src/object.h
+++ b/src/object.h
@@ -1301,28 +1301,18 @@
     return string;
   }
 
-  static String* AllocFromModifiedUtf8(Class* java_lang_String,
-                                       int32_t utf16_length,
-                                       const char* utf8_data_in) {
-    String* string = Alloc(java_lang_String, utf16_length);
-    uint16_t* utf16_data_out = string->array_->GetData();
-    ConvertModifiedUtf8ToUtf16(utf16_data_out, utf8_data_in);
-    string->ComputeHashCode();
-    return string;
-  }
-
-  // Creates a String of the given ASCII characters. It is an error to call this
-  // using non-ASCII characters as this function assumes one char per byte.
-  static String* AllocFromAscii(const char* ascii_data_in) {
-    return AllocFromModifiedUtf8(GetJavaLangString(),
-                                 strlen(ascii_data_in),
-                                 ascii_data_in);
+  static String* AllocFromModifiedUtf8(const char* utf) {
+    size_t char_count = ModifiedUtf8Len(utf);
+    return AllocFromModifiedUtf8(char_count, utf);
   }
 
   static String* AllocFromModifiedUtf8(int32_t utf16_length,
                                        const char* utf8_data_in) {
-    return AllocFromModifiedUtf8(GetJavaLangString(),
-                                 utf16_length, utf8_data_in);
+    String* string = Alloc(GetJavaLangString(), utf16_length);
+    uint16_t* utf16_data_out = string->array_->GetData();
+    ConvertModifiedUtf8ToUtf16(utf16_data_out, utf8_data_in);
+    string->ComputeHashCode();
+    return string;
   }
 
   static void InitClasses(Class* java_lang_String);
diff --git a/src/object_test.cc b/src/object_test.cc
index 8f9bed6..3f5333b 100644
--- a/src/object_test.cc
+++ b/src/object_test.cc
@@ -164,7 +164,7 @@
 }
 
 TEST_F(ObjectTest, StringEqualsUtf8) {
-  String* string = String::AllocFromAscii("android");
+  String* string = String::AllocFromModifiedUtf8("android");
   EXPECT_TRUE(string->Equals("android"));
   EXPECT_FALSE(string->Equals("Android"));
   EXPECT_FALSE(string->Equals("ANDROID"));
@@ -172,21 +172,21 @@
   EXPECT_FALSE(string->Equals("and"));
   EXPECT_FALSE(string->Equals("androids"));
 
-  String* empty = String::AllocFromAscii("");
+  String* empty = String::AllocFromModifiedUtf8("");
   EXPECT_TRUE(empty->Equals(""));
   EXPECT_FALSE(empty->Equals("a"));
 }
 
 TEST_F(ObjectTest, StringEquals) {
-  String* string = String::AllocFromAscii("android");
-  EXPECT_TRUE(string->Equals(String::AllocFromAscii("android")));
+  String* string = String::AllocFromModifiedUtf8("android");
+  EXPECT_TRUE(string->Equals(String::AllocFromModifiedUtf8("android")));
   EXPECT_FALSE(string->Equals("Android"));
   EXPECT_FALSE(string->Equals("ANDROID"));
   EXPECT_FALSE(string->Equals(""));
   EXPECT_FALSE(string->Equals("and"));
   EXPECT_FALSE(string->Equals("androids"));
 
-  String* empty = String::AllocFromAscii("");
+  String* empty = String::AllocFromModifiedUtf8("");
   EXPECT_TRUE(empty->Equals(""));
   EXPECT_FALSE(empty->Equals("a"));
 }
@@ -237,9 +237,9 @@
 
 
 TEST_F(ObjectTest, StringHashCode) {
-  EXPECT_EQ(0U, String::AllocFromAscii("")->GetHashCode());
-  EXPECT_EQ(65U, String::AllocFromAscii("A")->GetHashCode());
-  EXPECT_EQ(64578U, String::AllocFromAscii("ABC")->GetHashCode());
+  EXPECT_EQ(0U, String::AllocFromModifiedUtf8("")->GetHashCode());
+  EXPECT_EQ(65U, String::AllocFromModifiedUtf8("A")->GetHashCode());
+  EXPECT_EQ(64578U, String::AllocFromModifiedUtf8("ABC")->GetHashCode());
 }
 
 TEST_F(ObjectTest, InstanceOf) {
diff --git a/src/reference_table_test.cc b/src/reference_table_test.cc
index 4728cb0..1f065e6 100644
--- a/src/reference_table_test.cc
+++ b/src/reference_table_test.cc
@@ -12,7 +12,7 @@
 };
 
 TEST_F(ReferenceTableTest, Basics) {
-  Object* o1 = String::AllocFromModifiedUtf8(0, "hello");
+  Object* o1 = String::AllocFromModifiedUtf8("hello");
   Object* o2 = ShortArray::Alloc(0);
 
   // TODO: rewrite Dump to take a std::ostream& so we can test it better.
diff --git a/src/thread.cc b/src/thread.cc
index eb7a4f7..dd333d7 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -145,8 +145,7 @@
   Object* exception = exception_class->NewInstance();
   CHECK(exception != NULL);
 
-  size_t char_count = String::ModifiedUtf8Len(msg);
-  String* java_msg = String::AllocFromModifiedUtf8(char_count, msg);
+  String* java_msg = String::AllocFromModifiedUtf8(msg);
   CHECK(java_msg != NULL);
 
   // TODO: what if there's already a pending exception?
diff --git a/src/utils_test.cc b/src/utils_test.cc
index dd411c2..8f2b3ba 100644
--- a/src/utils_test.cc
+++ b/src/utils_test.cc
@@ -54,7 +54,7 @@
 TEST_F(UtilsTest, PrettyType) {
   EXPECT_EQ("null", PrettyType(NULL));
 
-  String* s = String::AllocFromModifiedUtf8(0, "");
+  String* s = String::AllocFromModifiedUtf8("");
   EXPECT_EQ("java.lang.String", PrettyType(s));
 
   ShortArray* a = ShortArray::Alloc(2);
