diff --git a/fb.cabal b/fb.cabal
--- a/fb.cabal
+++ b/fb.cabal
@@ -1,5 +1,5 @@
 name:              fb
-version:           0.9.4
+version:           0.9.5
 license:           BSD3
 license-file:      LICENSE
 author:            Felipe Lessa
diff --git a/src/Facebook.hs b/src/Facebook.hs
--- a/src/Facebook.hs
+++ b/src/Facebook.hs
@@ -41,10 +41,15 @@
     , getUser
 
       -- * Facebook's Open Graph API
+      -- ** Actions
     , createAction
     , Action
+      -- ** Checkins
     , createCheckin
+      -- ** FQL
     , fqlQuery
+    , FQLResult(..)
+      -- ** Helpers
     , (#=)
     , SimpleType(..)
 
diff --git a/src/Facebook/OpenGraph.hs b/src/Facebook/OpenGraph.hs
--- a/src/Facebook/OpenGraph.hs
+++ b/src/Facebook/OpenGraph.hs
@@ -1,17 +1,18 @@
 {-# LANGUAGE FlexibleContexts, OverloadedStrings #-}
 module Facebook.OpenGraph
     ( createAction
+    , Action(..)
     , createCheckin
     , fqlQuery
-    , Action(..)
+    , FQLResult(..)
     , (#=)
     , SimpleType(..)
     ) where
 
--- import Control.Applicative
+import Control.Applicative ((<$>))
 import Control.Arrow (first)
 import Control.Monad.Trans.Control (MonadBaseControl)
--- import Control.Monad (mzero)
+import Control.Monad (mzero)
 -- import Data.ByteString.Char8 (ByteString)
 import Data.Function (on)
 import Data.List (intersperse)
@@ -68,30 +69,7 @@
     Nothing       -> post "/me/" usertoken
     Just apptoken -> post ("/" <> accessTokenUserId usertoken <> "/") apptoken
 
--- | Creates a 'check-in' and returns its id. Place and
--- coordinates are both required by Facebook.
-createCheckin :: (C.MonadResource m, MonadBaseControl IO m)  =>
-                 Id               -- ^ Place Id
-              -> (Double, Double) -- ^ (Latitude, Longitude)
-              -> [Argument]       -- ^ Other arguments of the action.
-              -> UserAccessToken  -- ^ Required user access token.
-              -> FacebookT Auth m Id
-createCheckin pid (lat,lon) args usertoken = do
-  let coords = ("coordinates", toBS $ A.object ["latitude" A..= lat, "longitude" A..= lon])
-      body = ("place" #= pid) : coords : args
-      toBS = TE.encodeUtf8 . TL.toStrict . toLazyText . AE.fromValue
-  postObject "me/checkins" body usertoken
 
--- | Query the Facebook Graph using FQL.
-fqlQuery :: (C.MonadResource m, MonadBaseControl IO m) =>
-             Text                        -- ^ FQL Query
-          -> Maybe (AccessToken anyKind) -- ^ Optional access token
-          -> FacebookT anyAuth m A.Value
-fqlQuery fql mtoken =
-  runResourceInFb $ do
-    let query = ["q" #= fql]
-    asJson =<< fbhttp =<< fbreq "/fql" mtoken query
-
 -- | An action of your app.  Please refer to Facebook's
 -- documentation at
 -- <https://developers.facebook.com/docs/opengraph/keyconcepts/#actions-objects>
@@ -130,6 +108,52 @@
 
 instance IsString Action where
     fromString = Action . fromString
+
+
+-- | Creates a 'check-in' and returns its id. Place and
+-- coordinates are both required by Facebook.
+createCheckin :: (C.MonadResource m, MonadBaseControl IO m)  =>
+                 Id               -- ^ Place Id
+              -> (Double, Double) -- ^ (Latitude, Longitude)
+              -> [Argument]       -- ^ Other arguments of the action.
+              -> UserAccessToken  -- ^ Required user access token.
+              -> FacebookT Auth m Id
+createCheckin pid (lat,lon) args usertoken = do
+  let coords = ("coordinates", toBS $ A.object ["latitude" A..= lat, "longitude" A..= lon])
+      body = ("place" #= pid) : coords : args
+      toBS = TE.encodeUtf8 . TL.toStrict . toLazyText . AE.fromValue
+  postObject "me/checkins" body usertoken
+
+
+-- | Query the Facebook Graph using FQL.  You may want to use
+-- 'FQLResult' when parsing the returned JSON.
+fqlQuery :: (C.MonadResource m, MonadBaseControl IO m, A.FromJSON a) =>
+             Text                        -- ^ FQL Query
+          -> Maybe (AccessToken anyKind) -- ^ Optional access token
+          -> FacebookT anyAuth m a
+fqlQuery fql mtoken =
+  runResourceInFb $ do
+    let query = ["q" #= fql]
+    asJson =<< fbhttp =<< fbreq "/fql" mtoken query
+
+
+-- | Parses an FQL query result.  FQL query results are always of the form
+--
+-- @
+--   { "data": [ret1, ret2, ...] }
+-- @
+--
+-- This @newtype@ unwraps the array from the @"data"@ field
+-- automatically for you, so you may write something like:
+--
+-- @
+--   FQLResult [...] <- fqlQuery ...
+-- @
+newtype FQLResult a = FQLResult [a] deriving (Eq, Ord, Show, Read)
+
+instance A.FromJSON a => A.FromJSON (FQLResult a) where
+  parseJSON (A.Object v) = FQLResult <$> (v A..: "data")
+  parseJSON _ = mzero
 
 
 -- | Create an 'Argument' with a 'SimpleType'.  See the docs on
diff --git a/tests/runtests.hs b/tests/runtests.hs
--- a/tests/runtests.hs
+++ b/tests/runtests.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE OverloadedStrings, Rank2Types #-}
 
 import Control.Applicative
+import Control.Monad (mzero)
 import Control.Monad.IO.Class (MonadIO(liftIO))
 import Control.Monad.Trans.Class (lift)
 import Data.Int (Int8, Int16, Int32)
@@ -22,7 +23,7 @@
 import qualified Facebook as FB
 import qualified Network.HTTP.Conduit as H
 
-import Test.HUnit ((@?=), assertFailure)
+import Test.HUnit ((@?=))
 import Test.Hspec.Monadic
 import Test.Hspec.QuickCheck
 import Test.Hspec.HUnit ()
@@ -147,14 +148,13 @@
   describe' "fqlQuery" $ do
     it "is able to query Facebook's page name from its page id" $
       runNoAuth $ do
-        A.Object obj <- FB.fqlQuery "SELECT name FROM page WHERE page_id = 20531316728" Nothing
-        let mr = flip A.parseMaybe () $ const r
-            r = do
-                  dataArray <- obj A..: "data"
-                  (head dataArray) A..: "name"
-        case mr of
-          Nothing -> liftIO $ assertFailure "Could not parse FQL query response."
-          Just r' -> r' &?= ("Facebook" :: Text)
+        r <- FB.fqlQuery "SELECT name FROM page WHERE page_id = 20531316728" Nothing
+        r &?= FB.FQLResult [PageName "Facebook"]
+
+newtype PageName = PageName Text deriving (Eq, Show)
+instance A.FromJSON PageName where
+  parseJSON (A.Object v) = PageName <$> (v A..: "name")
+  parseJSON _ = mzero
 
 
 libraryTests :: H.Manager -> Specs
