diff --git a/Database/RethinkDB.hs b/Database/RethinkDB.hs
--- a/Database/RethinkDB.hs
+++ b/Database/RethinkDB.hs
@@ -39,6 +39,7 @@
 
   -- * Writing data
 
+  WriteResponse(..),
   insert, upsert,
   update, replace, delete,
   returnVals,
diff --git a/Database/RethinkDB/Driver.hs b/Database/RethinkDB/Driver.hs
--- a/Database/RethinkDB/Driver.hs
+++ b/Database/RethinkDB/Driver.hs
@@ -1,16 +1,21 @@
+{-# LANGUAGE OverloadedStrings #-}
+
 module Database.RethinkDB.Driver (
   run,
   run',
   Result(..),
   runOpts,
   RunOptions(..),
+  WriteResponse(..)
   ) where
 
-import Data.Aeson (Value, FromJSON, fromJSON)
+import Data.Aeson (Value(..), FromJSON(..), fromJSON, (.:), (.:?))
 import qualified Data.Aeson (Result(Error, Success))
 import Control.Monad
 import Control.Concurrent.MVar (MVar, takeMVar)
 import Data.Sequence ((|>))
+import Data.Text (Text)
+import Control.Applicative ((<$>), (<*>))
 
 import Database.RethinkDB.Protobuf.Ql2.Query (Query(..))
 import Database.RethinkDB.Protobuf.Ql2.Query.AssocPair (AssocPair(..))
@@ -75,7 +80,7 @@
 
 instance FromJSON a => Result [a] where
   convertResult = collect <=< convertResult
-  
+
 instance FromJSON a => Result (Maybe a) where
   convertResult r = do
     c <- convertResult r
@@ -87,3 +92,31 @@
         case cadr of
           Nothing -> return $ Just a
           Just _ -> return Nothing
+
+data WriteResponse = WriteResponse {
+  writeResponseInserted :: Int,
+  writeResponseDeleted :: Int,
+  writeResponseReplaced :: Int,
+  writeResponseUnchanged :: Int,
+  writeResponseSkipped :: Int,
+  writeResponseErrors :: Int,
+  writeResponseFirstError :: Maybe Text,
+  writeResponseGeneratedKeys :: Maybe [Text],
+  writeResponseOldVal :: Maybe Value,
+  writeResponseNewVal :: Maybe Value
+  } deriving Show
+
+instance FromJSON WriteResponse where
+  parseJSON (Data.Aeson.Object o) =
+    WriteResponse
+    <$> o .: "inserted"
+    <*> o .: "deleted"
+    <*> o .: "replaced"
+    <*> o .: "unchanged"
+    <*> o .: "skipped"
+    <*> o .: "errors"
+    <*> o .:? "first_error"
+    <*> o .:? "generated_keys"
+    <*> o .:? "old_val"
+    <*> o .:? "new_val"
+  parseJSON _ = mzero
diff --git a/Database/RethinkDB/Functions.hs b/Database/RethinkDB/Functions.hs
--- a/Database/RethinkDB/Functions.hs
+++ b/Database/RethinkDB/Functions.hs
@@ -273,29 +273,29 @@
 tableList :: Database -> ReQL
 tableList (O.Database name) = op TABLE_LIST [name] ()
 
--- | Get a document by primary key 
+-- | Get a document by primary key
 get :: (Expr s, Expr k) => k -> s -> ReQL
 get k e = op GET (e, k) ()
 
 -- | Insert a document or a list of documents into a table
 insert :: (Expr table, Expr object) => object -> table -> ReQL
-insert a tb = op INSERT (tb, a) ()
+insert a tb = canReturnVals $ op INSERT (tb, a) ()
 
 -- | Like insert, but update existing documents with the same primary key
 upsert :: (Expr table, Expr object) => object -> table -> ReQL
-upsert a tb = op INSERT (tb, a) ["upsert" := P.True]
+upsert a tb = canReturnVals $ op INSERT (tb, a) ["upsert" := P.True]
 
 -- | Add to or modify the contents of a document
 update :: (Expr selection) => (ReQL -> ReQL) -> selection -> ReQL
-update f s = op UPDATE (s, f) ()
+update f s = canReturnVals $ op UPDATE (s, f) ()
 
 -- | Replace a document with another
 replace :: (Expr selection) => (ReQL -> ReQL) -> selection -> ReQL
-replace f s = op REPLACE (s, f) ()
+replace f s = canReturnVals $ op REPLACE (s, f) ()
 
 -- | Delete the documents
 delete :: (Expr selection) => selection -> ReQL
-delete s = op DELETE [s] ()
+delete s = canReturnVals $ op DELETE [s] ()
 
 -- | Convert a value to a different type
 coerceTo :: (Expr x) => ReQL -> x -> ReQL
diff --git a/rethinkdb.cabal b/rethinkdb.cabal
--- a/rethinkdb.cabal
+++ b/rethinkdb.cabal
@@ -1,5 +1,5 @@
 name:                rethinkdb
-version:             1.8.0.3
+version:             1.8.0.4
 description:         RethinkDB is a distributed document store with a powerful query language.
 synopsis:            RethinkDB driver for Haskell
 homepage:            http://github.com/atnnn/haskell-rethinkdb
