diff --git a/lib/Analysis/BasicObjCFoundationChecks.cpp b/lib/Analysis/BasicObjCFoundationChecks.cpp
index 112a3a1..98e9551 100644
--- a/lib/Analysis/BasicObjCFoundationChecks.cpp
+++ b/lib/Analysis/BasicObjCFoundationChecks.cpp
@@ -417,7 +417,7 @@
     if (!R) return false;
   }
   
-  QualType T = Ctx.getCanonicalType(R->getObjectType(Ctx));
+  QualType T = Ctx.getCanonicalType(R->getValueType(Ctx));
   
   // FIXME: If the pointee isn't an integer type, should we flag a warning?
   //  People can do weird stuff with pointers.
diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp
index e4e0cfa..b9eeb9f 100644
--- a/lib/Analysis/BasicStore.cpp
+++ b/lib/Analysis/BasicStore.cpp
@@ -357,7 +357,7 @@
         // elsewhere. Food for thought.
         if (const TypedRegion *TyR = dyn_cast<TypedRegion>(R)) {
           if (TyR->isBoundable(C) &&
-              Loc::IsLocType(TyR->getObjectType(C)))              
+              Loc::IsLocType(TyR->getValueType(C)))              
             V = X->getLoc();
         }
       }
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index 0f251b3..7327887 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -2661,7 +2661,7 @@
           if (R->isBoundable(Ctx)) {
             // Set the value of the variable to be a conjured symbol.
             unsigned Count = Builder.getCurrentBlockCount();
-            QualType T = R->getObjectType(Ctx);
+            QualType T = R->getValueType(Ctx);
           
             if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())){
               ValueManager &ValMgr = Eng.getValueManager();
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index b92705c..bc6a36c 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -1785,7 +1785,7 @@
       // FIXME: The proper thing to do is to really iterate over the
       //  container.  We will do this with dispatch logic to the store.
       //  For now, just 'conjure' up a symbolic value.
-      QualType T = R->getObjectType(getContext());
+      QualType T = R->getValueType(getContext());
       assert (Loc::IsLocType(T));
       unsigned Count = Builder->getCurrentBlockCount();
       SymbolRef Sym = SymMgr.getConjuredSymbol(elem, T, Count);
diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp
index ff86708..6e9a1a6 100644
--- a/lib/Analysis/RegionStore.cpp
+++ b/lib/Analysis/RegionStore.cpp
@@ -492,7 +492,7 @@
                                            const MemRegion* R) {
   if (const VarRegion* VR = dyn_cast<VarRegion>(R)) {
     // Get the type of the variable.
-    QualType T = VR->getDesugaredObjectType(getContext());
+    QualType T = VR->getDesugaredValueType(getContext());
 
     // FIXME: Handle variable-length arrays.
     if (isa<VariableArrayType>(T))
@@ -510,7 +510,7 @@
     // that type.
     if (CastTy) {
       QualType EleTy =cast<PointerType>(CastTy->getTypePtr())->getPointeeType();
-      QualType VarTy = VR->getObjectType(getContext());
+      QualType VarTy = VR->getValueType(getContext());
       uint64_t EleSize = getContext().getTypeSize(EleTy);
       uint64_t VarSize = getContext().getTypeSize(VarTy);
       return NonLoc::MakeIntVal(getBasicVals(), VarSize / EleSize, false);
@@ -605,8 +605,8 @@
   if (!ArrayR)
     return UnknownVal();
   
-  // Strip off typedefs from the ArrayRegion's ObjectType.
-  QualType T = ArrayR->getObjectType(getContext())->getDesugaredType();
+  // Strip off typedefs from the ArrayRegion's ValueType.
+  QualType T = ArrayR->getValueType(getContext())->getDesugaredType();
   ArrayType *AT = cast<ArrayType>(T);
   T = AT->getElementType();
   
@@ -676,7 +676,7 @@
         return CastResult(state, R);
     }
 
-    QualType ObjTy = cast<TypedRegion>(R)->getObjectType(getContext());
+    QualType ObjTy = cast<TypedRegion>(R)->getValueType(getContext());
     uint64_t PointeeTySize = getContext().getTypeSize(PointeeTy);
     uint64_t ObjTySize = getContext().getTypeSize(ObjTy);
 
@@ -722,7 +722,7 @@
     // p += 3;
     // Note that p binds to a TypedViewRegion(SymbolicRegion).
     nonloc::ConcreteInt Idx(getBasicVals().getZeroWithPtrWidth(false));
-    ER = MRMgr.getElementRegion(TR->getObjectType(getContext()), Idx, TR);
+    ER = MRMgr.getElementRegion(TR->getValueType(getContext()), Idx, TR);
   }
 
   SVal Idx = ER->getIndex();
@@ -782,7 +782,7 @@
   //
   // Such funny addressing will occur due to layering of regions.
 
-  QualType RTy = R->getObjectType(getContext());
+  QualType RTy = R->getValueType(getContext());
 
   if (RTy->isStructureType())
     return RetrieveStruct(St, R);
@@ -868,7 +868,7 @@
 }
 
 SVal RegionStoreManager::RetrieveStruct(const GRState* St,const TypedRegion* R){
-  QualType T = R->getObjectType(getContext());
+  QualType T = R->getValueType(getContext());
   assert(T->isStructureType());
 
   const RecordType* RT = cast<RecordType>(T.getTypePtr());
@@ -893,7 +893,7 @@
 }
 
 SVal RegionStoreManager::RetrieveArray(const GRState* St, const TypedRegion* R){
-  QualType T = R->getObjectType(getContext());
+  QualType T = R->getValueType(getContext());
   ConstantArrayType* CAT = cast<ConstantArrayType>(T.getTypePtr());
 
   llvm::ImmutableList<SVal> ArrayVal = getBasicVals().getEmptySValList();
@@ -903,7 +903,7 @@
 
   for (; i < Size; ++i) {
     SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
-    ElementRegion* ER = MRMgr.getElementRegion(R->getObjectType(getContext()),
+    ElementRegion* ER = MRMgr.getElementRegion(R->getValueType(getContext()),
                                                Idx, R);
     QualType ETy = ER->getElementType();
     SVal ElementVal = Retrieve(St, loc::MemRegionVal(ER), ETy);
@@ -920,7 +920,7 @@
 
   // Check if the region is a struct region.
   if (const TypedRegion* TR = dyn_cast<TypedRegion>(R))
-    if (TR->getObjectType(getContext())->isStructureType())
+    if (TR->getValueType(getContext())->isStructureType())
       return BindStruct(St, TR, V);
 
   Store store = St->getStore();
@@ -1154,7 +1154,7 @@
 
 const GRState* RegionStoreManager::BindArray(const GRState* St, 
                                              const TypedRegion* R, SVal Init) {
-  QualType T = R->getObjectType(getContext());
+  QualType T = R->getValueType(getContext());
   assert(T->isArrayType());
 
   // When we are binding the whole array, it always has default value 0.
@@ -1219,7 +1219,7 @@
 
 const GRState*
 RegionStoreManager::BindStruct(const GRState* St, const TypedRegion* R, SVal V){
-  QualType T = R->getObjectType(getContext());
+  QualType T = R->getValueType(getContext());
   assert(T->isStructureType());
 
   const RecordType* RT = T->getAsRecordType();
diff --git a/lib/Analysis/SVals.cpp b/lib/Analysis/SVals.cpp
index 1090aaa..58a0b80 100644
--- a/lib/Analysis/SVals.cpp
+++ b/lib/Analysis/SVals.cpp
@@ -301,7 +301,7 @@
   SymbolRef sym = SymMgr.getRegionRValueSymbol(R);
                                 
   if (const TypedRegion* TR = dyn_cast<TypedRegion>(R)) {
-    QualType T = TR->getObjectType(SymMgr.getContext());
+    QualType T = TR->getValueType(SymMgr.getContext());
 
     // If T is of function pointer type, create a CodeTextRegion wrapping a
     // symbol.
diff --git a/lib/Analysis/SymbolManager.cpp b/lib/Analysis/SymbolManager.cpp
index ee18f2c..84019fd 100644
--- a/lib/Analysis/SymbolManager.cpp
+++ b/lib/Analysis/SymbolManager.cpp
@@ -167,7 +167,7 @@
 
 QualType SymbolRegionRValue::getType(ASTContext& C) const {
   if (const TypedRegion* TR = dyn_cast<TypedRegion>(R))
-    return TR->getObjectType(C);
+    return TR->getValueType(C);
   
   return QualType();
 }
