diff --git a/colorless.cabal b/colorless.cabal
--- a/colorless.cabal
+++ b/colorless.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           colorless
-version:        2.2.13
+version:        2.2.14
 synopsis:       Colorless
 description:    Colorless
 category:       Web
@@ -35,6 +35,7 @@
     , mtl
     , random
     , scientific
+    , safe-exceptions
     , text
     , text-conversions
     , unordered-containers
diff --git a/library/Colorless/Client/Exchange.hs b/library/Colorless/Client/Exchange.hs
--- a/library/Colorless/Client/Exchange.hs
+++ b/library/Colorless/Client/Exchange.hs
@@ -10,6 +10,7 @@
 
 import Colorless.Types (RuntimeError, HasType(..), Version(..))
 import Colorless.Ast (ToAst(..))
+import Colorless.Val (ToVal(..), FromVal(..))
 import Colorless.Client.Expr (Expr, exprJSON)
 
 data Request meta a = Request
@@ -19,11 +20,11 @@
   , query :: Expr a
   }
 
-instance (ToAst meta, HasType meta, ToAst a, HasType a) => ToJSON (Request meta a) where
+instance (ToVal meta, HasType meta, ToAst a, HasType a) => ToJSON (Request meta a) where
   toJSON Request{colorless, version, meta, query} = object
     [ "colorless" .= colorless
     , "version" .= version
-    , "meta" .= toAst meta
+    , "meta" .= toVal meta
     , "query" .= exprJSON query
     ]
 
@@ -32,18 +33,22 @@
   | ResponseError'Runtime RuntimeError
   deriving (Eq, Show)
 
-instance (FromJSON err, HasType err) => FromJSON (ResponseError err) where
+instance (FromVal err, HasType err) => FromJSON (ResponseError err) where
   parseJSON (Object o) = do
     tag <- o .: "tag"
     case tag :: Text of
-      "Service" -> ResponseError'Service <$> o .: "service"
+      "Service" -> do
+        m <- o .: "service"
+        case fromVal m of
+          Nothing -> mzero
+          Just v -> return $ ResponseError'Service v
       "Runtime" -> ResponseError'Runtime <$> o .: "runtime"
       _ -> mzero
   parseJSON _ = mzero
 
-instance ToJSON err => ToJSON (ResponseError err) where
+instance ToVal err => ToJSON (ResponseError err) where
   toJSON = \case
-    ResponseError'Service m -> object [ "tag" .= String "Service", "service" .= m ]
+    ResponseError'Service m -> object [ "tag" .= String "Service", "service" .= toVal m ]
     ResponseError'Runtime m -> object [ "tag" .= String "Runtime", "runtime" .= m ]
 
 data Response err a
@@ -51,15 +56,19 @@
   | Response'Success a
   deriving (Show, Eq)
 
-instance (FromJSON err, HasType err, FromJSON a, HasType a) => FromJSON (Response err a) where
+instance (FromVal err, HasType err, FromVal a, HasType a) => FromJSON (Response err a) where
   parseJSON (Object o) = do
     tag <- o .: "tag"
     case tag :: Text of
-      "Success" -> Response'Success <$> o .: "success"
+      "Success" -> do
+        m <- o .: "success"
+        case fromVal m of
+          Nothing -> mzero
+          Just v -> return $ Response'Success v
       "Error" -> Response'Error <$> o .: "error"
       _ -> mzero
   parseJSON _ = mzero
 
-instance (ToJSON err, ToJSON a) => ToJSON (Response err a) where
+instance (ToVal err, HasType err, ToVal a, HasType a) => ToJSON (Response err a) where
   toJSON (Response'Error m) = object [ "tag" .= String "Error", "error" .= m ]
-  toJSON (Response'Success m) = object [ "tag" .= String "Success", "success" .= m ]
+  toJSON (Response'Success m) = object [ "tag" .= String "Success", "success" .= toVal m ]
diff --git a/library/Colorless/Imports.hs b/library/Colorless/Imports.hs
--- a/library/Colorless/Imports.hs
+++ b/library/Colorless/Imports.hs
@@ -5,6 +5,7 @@
   , module Data.Text
   , module Data.Text.Conversions
   , module Data.ByteString.Lazy.Char8
+  , module Control.Exception.Safe
   ) where
 
 import Data.Map (Map, fromList, toList, empty, size)
@@ -13,3 +14,4 @@
 import Data.ByteString.Lazy.Char8 (ByteString)
 import Data.Text (Text)
 import Data.Text.Conversions (ToText(..), FromText(..))
+import Control.Exception.Safe (MonadThrow, MonadCatch, catch)
diff --git a/library/Colorless/ServiceThrower.hs b/library/Colorless/ServiceThrower.hs
--- a/library/Colorless/ServiceThrower.hs
+++ b/library/Colorless/ServiceThrower.hs
@@ -1,17 +1,19 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 module Colorless.ServiceThrower
   ( ServiceThrower(..)
   ) where
 
+import Control.Exception.Safe
 import Control.Monad.Except
 import Data.Aeson
 
 import qualified Colorless.Server.Exchange as Server
 
-class Monad m => ServiceThrower m where
+class MonadThrow m => ServiceThrower m where
   serviceThrow :: Value -> m a
+  serviceThrow err = throw err
 
-instance ServiceThrower IO where
-  serviceThrow err = error $ "Service error - " ++ show err
+instance Exception Value
 
-instance Monad m => ServiceThrower (ExceptT Server.Response m) where
+instance MonadThrow m => ServiceThrower (ExceptT Server.Response m) where
   serviceThrow = throwError . Server.Response'Error . Server.ResponseError'Service
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: colorless
-version: '2.2.13'
+version: '2.2.14'
 category: Web
 synopsis: Colorless
 description: Colorless
@@ -41,6 +41,7 @@
   - mtl
   - random
   - scientific
+  - safe-exceptions
   - text
   - text-conversions
   - unordered-containers
