diff --git a/gnutls.cabal b/gnutls.cabal
--- a/gnutls.cabal
+++ b/gnutls.cabal
@@ -1,5 +1,5 @@
 name: gnutls
-version: 0.1.5
+version: 0.1.6
 license: GPL-3
 license-file: license.txt
 author: John Millikin <jmillikin@gmail.com>
@@ -26,7 +26,7 @@
 source-repository this
   type: git
   location: https://john-millikin.com/code/haskell-gnutls/
-  tag: haskell-gnutls_0.1.5
+  tag: haskell-gnutls_0.1.6
 
 library
   hs-source-dirs: lib
diff --git a/lib/Network/Protocol/TLS/GNU.hs b/lib/Network/Protocol/TLS/GNU.hs
--- a/lib/Network/Protocol/TLS/GNU.hs
+++ b/lib/Network/Protocol/TLS/GNU.hs
@@ -42,8 +42,9 @@
 	, CertificateType (..)
 	) where
 
+import           Control.Applicative (Applicative, pure, (<*>))
 import qualified Control.Concurrent.MVar as M
-import           Control.Monad (when, foldM, foldM_)
+import           Control.Monad (ap, when, foldM, foldM_)
 import qualified Control.Monad.Error as E
 import           Control.Monad.Error (ErrorType)
 import qualified Control.Monad.Reader as R
@@ -94,6 +95,10 @@
 
 instance Functor TLS where
 	fmap f = TLS . fmap f . unTLS
+
+instance Applicative TLS where
+	pure = TLS . return
+	(<*>) = ap
 
 instance Monad TLS where
 	return = TLS . return
diff --git a/lib/Network/Protocol/TLS/GNU/ErrorT.hs b/lib/Network/Protocol/TLS/GNU/ErrorT.hs
--- a/lib/Network/Protocol/TLS/GNU/ErrorT.hs
+++ b/lib/Network/Protocol/TLS/GNU/ErrorT.hs
@@ -20,7 +20,8 @@
 	, mapErrorT
 	) where
 
-import           Control.Monad (liftM)
+import           Control.Applicative (Applicative, pure, (<*>))
+import           Control.Monad (ap,liftM)
 import           Control.Monad.Trans (MonadIO, liftIO)
 import           Control.Monad.Trans.Class (MonadTrans, lift)
 import qualified Control.Monad.Error as E
@@ -34,6 +35,18 @@
 
 instance Functor m => Functor (ErrorT e m) where
 	fmap f = ErrorT . fmap (fmap f) . runErrorT
+
+instance (Functor m, Monad m) => Applicative (ErrorT e m) where
+	pure a  = ErrorT $ return (Right a)
+	f <*> v = ErrorT $ do
+		mf <- runErrorT f
+		case mf of
+			Left  e -> return (Left e)
+			Right k -> do
+				mv <- runErrorT v
+				case mv of
+					Left  e -> return (Left e)
+					Right x -> return (Right (k x))
 
 instance Monad m => Monad (ErrorT e m) where
 	return = ErrorT . return . Right
