diff --git a/purescript.cabal b/purescript.cabal
--- a/purescript.cabal
+++ b/purescript.cabal
@@ -1,5 +1,5 @@
 name: purescript
-version: 0.1.11
+version: 0.1.12
 cabal-version: >=1.8
 build-type: Simple
 license: MIT
diff --git a/src/Language/PureScript/TypeChecker/Types.hs b/src/Language/PureScript/TypeChecker/Types.hs
--- a/src/Language/PureScript/TypeChecker/Types.hs
+++ b/src/Language/PureScript/TypeChecker/Types.hs
@@ -295,15 +295,14 @@
   lift $ ensureNoDuplicateProperties ps
   ts <- mapM (infer m . snd) ps
   let fields = zipWith (\(name, _) t -> (name, t)) ps ts
-  return $ Object $ typesToRow fields
+  return $ Object $ rowFromList (fields, REmpty)
 infer' m (ObjectUpdate o ps) = do
   lift $ ensureNoDuplicateProperties ps
-  obj <- infer m o
   row <- fresh
-  ts <- mapM (infer m . snd) ps
-  let tys = zipWith (\(name, _) t -> (name, t)) ps ts
-  obj ~~ Object (rowFromList (tys, row))
-  return obj
+  newTys <- zipWith (\(name, _) t -> (name, t)) ps <$> mapM (infer m . snd) ps
+  oldTys <- zip (map fst ps) <$> replicateM (length ps) fresh
+  check m o $ Object $ rowFromList (oldTys, row)
+  return $ Object $ rowFromList (newTys, row)
 infer' m (Indexer index val) = do
   el <- fresh
   check m index Number
@@ -662,9 +661,13 @@
 check' m (ObjectLiteral ps) (Object row) = do
   lift $ ensureNoDuplicateProperties ps
   checkProperties m ps row False
-check' m (ObjectUpdate obj ps) objTy@(Object row) = do
+check' m (ObjectUpdate obj ps) (Object row) = do
   lift $ ensureNoDuplicateProperties ps
-  check m obj objTy
+  us <- zip (map fst ps) <$> replicateM (length ps) fresh
+  let (propsToCheck, rest) = rowToList row
+      propsToRemove = map fst ps
+      remainingProps = filter (\(p, _) -> p `notElem` propsToRemove) propsToCheck
+  check m obj (Object (rowFromList (us ++ remainingProps, rest)))
   checkProperties m ps row True
 check' m (Accessor prop val) ty = do
   rest <- fresh
diff --git a/src/Language/PureScript/Types.hs b/src/Language/PureScript/Types.hs
--- a/src/Language/PureScript/Types.hs
+++ b/src/Language/PureScript/Types.hs
@@ -44,10 +44,6 @@
   | RCons String Type Row
   | RSkolem Int deriving (Show, Eq, Data, Typeable)
 
-typesToRow :: [(String, Type)] -> Row
-typesToRow [] = REmpty
-typesToRow ((name, ty):tys) = RCons name ty (typesToRow tys)
-
 rowToList :: Row -> ([(String, Type)], Row)
 rowToList (RCons name ty row) = let (tys, rest) = rowToList row
                                in ((name, ty):tys, rest)
