diff --git a/src/compiler/codegen/arm/MethodCodegenDriver.cc b/src/compiler/codegen/arm/MethodCodegenDriver.cc
index eb2c06b..cbf5867 100644
--- a/src/compiler/codegen/arm/MethodCodegenDriver.cc
+++ b/src/compiler/codegen/arm/MethodCodegenDriver.cc
@@ -780,22 +780,6 @@
     oatLockCallTemps(cUnit);
 
     uint32_t dexMethodIdx = mir->dalvikInsn.vB;
-    // Is this the special "Ljava/lang/Object;.<init>:()V" case?
-    if (direct && !range) {
-        Method* target = cUnit->dex_cache->GetResolvedMethods()->Get(dexMethodIdx);
-        if (target) {
-            if (PrettyMethod(target) == "java.lang.Object.<init>()V") {
-                RegLocation rlArg = oatGetSrc(cUnit, mir, 0);
-                loadValueDirectFixed(cUnit, rlArg, r0);
-                loadWordDisp(cUnit, rSELF,
-                         OFFSETOF_MEMBER(Thread, pObjectInit), rLR);
-                genNullCheck(cUnit, oatSSASrc(mir,0), r0, mir);
-                opReg(cUnit, kOpBlx, rLR);
-                oatClobberCalleeSave(cUnit);
-                return;
-            }
-        }
-    }
 
     if (range) {
         callState = genDalvikArgsRange(cUnit, mir, dInsn, callState, pNullCk,
diff --git a/src/java_lang_Object.cc b/src/java_lang_Object.cc
index 30d8223..7c72604 100644
--- a/src/java_lang_Object.cc
+++ b/src/java_lang_Object.cc
@@ -23,12 +23,6 @@
 
 namespace {
 
-jclass Object_getClass(JNIEnv* env, jobject javaThis) {
-  // TODO: we can just share the Object::class_ field with Java and use field access instead.
-  Object* o = Decode<Object*>(env, javaThis);
-  return AddLocalReference<jclass>(env, o->GetClass());
-}
-
 jobject Object_internalClone(JNIEnv* env, jobject javaThis) {
   ScopedThreadStateChange tsc(Thread::Current(), Thread::kRunnable);
   Object* o = Decode<Object*>(env, javaThis);
@@ -51,7 +45,6 @@
 }
 
 JNINativeMethod gMethods[] = {
-  NATIVE_METHOD(Object, getClass, "()Ljava/lang/Class;"),
   NATIVE_METHOD(Object, internalClone, "(Ljava/lang/Cloneable;)Ljava/lang/Object;"),
   NATIVE_METHOD(Object, notify, "()V"),
   NATIVE_METHOD(Object, notifyAll, "()V"),
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index d492deb..ee801be 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -313,7 +313,7 @@
 
   // Check that registering native methods is successful
   {
-    JNINativeMethod methods[] = {{"getClass", "()Ljava/lang/Class;", reinterpret_cast<void*>(BogusMethod)}};
+    JNINativeMethod methods[] = {{"notify", "()V", reinterpret_cast<void*>(BogusMethod)}};
     env_->RegisterNatives(jlobject, methods, 1);
   }
   EXPECT_FALSE(env_->ExceptionCheck());
diff --git a/src/runtime_support.cc b/src/runtime_support.cc
index 1ac92fd..14b14e0 100644
--- a/src/runtime_support.cc
+++ b/src/runtime_support.cc
@@ -119,20 +119,6 @@
   LOG(INFO) << "Info: " << info;
 }
 
-extern "C" uint32_t artObjectInitFromCode(Object* o, Thread* self, Method** sp) {
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  Class* c = o->GetClass();
-  if (UNLIKELY(c->IsFinalizable())) {
-    Heap::AddFinalizerReference(self, o);
-  }
-  /*
-   * NOTE: once debugger/profiler support is added, we'll need to check
-   * here and branch to actual compiled object.<init> to handle any
-   * breakpoint/logging activities if either is active.
-   */
-  return self->IsExceptionPending() ? -1 : 0;
-}
-
 // Return value helper for jobject return types
 extern Object* DecodeJObjectInThread(Thread* thread, jobject obj) {
   if (thread->IsExceptionPending()) {
diff --git a/src/runtime_support.h b/src/runtime_support.h
index c8db48c..954c362 100644
--- a/src/runtime_support.h
+++ b/src/runtime_support.h
@@ -74,7 +74,6 @@
   extern "C" void art_invoke_super_trampoline_with_access_check(uint32_t, void*);
   extern "C" void art_invoke_virtual_trampoline_with_access_check(uint32_t, void*);
   extern "C" void art_lock_object_from_code(void*);
-  extern "C" void art_object_init_from_code(void*);
   extern "C" void art_test_suspend();
   extern "C" void art_throw_array_bounds_from_code(int32_t index, int32_t limit);
   extern "C" void art_throw_div_zero_from_code();
diff --git a/src/runtime_support_arm.S b/src/runtime_support_arm.S
index 8113b5b..7456853 100644
--- a/src/runtime_support_arm.S
+++ b/src/runtime_support_arm.S
@@ -609,23 +609,6 @@
     bxne   lr                         @ return on success
     DELIVER_PENDING_EXCEPTION
 
-    .global art_object_init_from_code
-    .extern artObjectInitFromCode
-    /*
-     * Entry from managed code to perform Object.<init> string. R0 holds the object to initialize.
-     * On success, 0 is returned. Otherwise there is a pending exception to deliver.
-     */
-art_object_init_from_code:
-    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
-    mov    r1, r9                     @ pass Thread::Current
-    mov    r2, sp                     @ pass SP
-    @ artObjectInitFromCode(Object* o, Thread*, SP)
-    bl     artObjectInitFromCode
-    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
-    cmp    r0, #0                     @ success if result is zero
-    bxeq   lr                         @ return on success
-    DELIVER_PENDING_EXCEPTION
-
     .global art_alloc_object_from_code
     .extern artAllocObjectFromCode
     /*
diff --git a/src/thread.cc b/src/thread.cc
index 8592bd3..67702cd 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -120,7 +120,6 @@
   pInvokeSuperTrampolineWithAccessCheck = art_invoke_super_trampoline_with_access_check;
   pInvokeVirtualTrampolineWithAccessCheck = art_invoke_virtual_trampoline_with_access_check;
   pLockObjectFromCode = art_lock_object_from_code;
-  pObjectInit = art_object_init_from_code;
   pResolveStringFromCode = art_resolve_string_from_code;
   pSet32Instance = art_set32_instance_from_code;
   pSet64Instance = art_set64_instance_from_code;
diff --git a/src/thread.h b/src/thread.h
index b21af96..4bfc5cf 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -624,7 +624,6 @@
   void* (*pInitializeTypeFromCode)(uint32_t, void*);
   void* (*pInitializeTypeAndVerifyAccessFromCode)(uint32_t, void*);
   void (*pLockObjectFromCode)(void*);
-  void (*pObjectInit)(void*);
   void* (*pResolveMethodFromCode)(void*, uint32_t, bool);
   void* (*pResolveStringFromCode)(void*, uint32_t);
   int (*pSet32Instance)(uint32_t, void*, int32_t);  // field_idx, obj, src
