diff --git a/jsaddle.cabal b/jsaddle.cabal
--- a/jsaddle.cabal
+++ b/jsaddle.cabal
@@ -1,5 +1,5 @@
 name: jsaddle
-version: 0.5.1.1
+version: 0.5.2.0
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
diff --git a/src/Language/Javascript/JSaddle/Object.hs b/src/Language/Javascript/JSaddle/Object.hs
--- a/src/Language/Javascript/JSaddle/Object.hs
+++ b/src/Language/Javascript/JSaddle/Object.hs
@@ -123,6 +123,7 @@
 import Data.Text (Text)
 
 -- $setup
+-- >>> import Control.Concurrent.MVar (newEmptyMVar, takeMVar, putMVar)
 -- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
 -- >>> import Language.Javascript.JSaddle.Evaluate (eval)
 -- >>> import Language.Javascript.JSaddle.Value (val, valToText, JSNull(..), deRefVal)
@@ -409,19 +410,24 @@
 --
 -- >>> testJSaddle $ eval "(function(f) {f('Hello');})(function (a) {console.log(a)})"
 -- undefined
--- >>> testJSaddle . deRefVal $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ args -> valToText (head args) >>= (liftIO . putStrLn . T.unpack) ]
+-- >>> :{
+--  testJSaddle $ do
+--    result <- liftIO newEmptyMVar
+--    deRefVal $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ [arg1] -> do
+--         valToText arg1 >>= (liftIO . putMVar result)
+--         ]
+--    liftIO $ takeMVar result
+-- :}
 -- Hello
--- undefined
 fun :: JSCallAsFunction -> JSCallAsFunction
 fun = id
 
 #ifdef ghcjs_HOST_OS
-type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
+data Function = Function {functionCallback :: Callback (JSVal -> JSVal -> IO ()), functionObject :: Object}
 #else
-type HaskellCallback = ()
+newtype Function = Function {functionObject :: Object}
 #endif
 
-data Function = Function {functionCallback :: HaskellCallback, functionObject :: Object}
 
 -- ^ Make a JavaScript function object that wraps a Haskell function.
 function :: JSCallAsFunction -- ^ Haskell function to call
@@ -440,7 +446,7 @@
     obj <- Object <$> sendLazyCommand NewCallback
     add <- addCallback <$> askJSM
     liftIO $ add obj f
-    return $ Function () obj
+    return $ Function obj
 #endif
 
 freeFunction :: Function -> JSM ()
@@ -448,13 +454,13 @@
 freeFunction (Function callback _) = liftIO $
     releaseCallback callback
 #else
-freeFunction (Function callback obj) = do
+freeFunction (Function obj) = do
     free <- freeCallback <$> askJSM
     liftIO $ free obj
 #endif
 
 instance ToJSVal Function where
-    toJSVal (Function _ f) = toJSVal f
+    toJSVal = toJSVal . functionObject
 
 -- | A callback to Haskell can be used as a JavaScript value.  This will create
 --   an anonymous JavaScript function object.  Use 'function' to create one with
diff --git a/tests/DocTest.hs b/tests/DocTest.hs
--- a/tests/DocTest.hs
+++ b/tests/DocTest.hs
@@ -57,6 +57,7 @@
         "-package=containers-" ++ VERSION_containers,
         "-package=process-" ++ VERSION_process,
         "-package=filepath-" ++ VERSION_filepath,
+        "-package=ref-tf-" ++ VERSION_ref_tf,
         "-isrc",
         "src/Language/Javascript/JSaddle/Arguments.hs",
         "src/Language/Javascript/JSaddle/Classes.hs",
