diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -3,5 +3,12 @@
 A little library for doing encryption using a combination of RSA and AEP, using the
 [cryptonite](https://hackage.haskell.org/package/cryptonite) library for cryptography.
 
-It is meant for use with very large files. I've tested it on a 6 Gigabyte file and it
-works within seconds for all functions.
+```haskell
+import Cropty
+
+main = do
+  privateKey <- generatePrivateKey KeySize1024
+  secret <- encrypt (privateToPublic privateKey) "Hello!"
+  decoded <- decrypt privateKey secret
+  assert (secret == decoded)
+```
diff --git a/cropty.cabal b/cropty.cabal
--- a/cropty.cabal
+++ b/cropty.cabal
@@ -1,7 +1,7 @@
 cabal-version:       2.4
 
 name:                cropty
-version:             0.2.0.0
+version:             0.3.0.0
 synopsis:            Encryption and decryption
 description:         Encryption and decryption.
 homepage:            https://github.com/SamuelSchlesinger/cropty
@@ -35,6 +35,7 @@
   build-depends:       base >= 4.12 && < 5,
                        hedgehog >=1.0,
                        unliftio >=0.2,
+                       binary >=0.8,
                        cropty
   default-language:    Haskell2010
   ghc-options:         -threaded -rtsopts "-with-rtsopts=-N -T"
diff --git a/src/Cropty.hs b/src/Cropty.hs
--- a/src/Cropty.hs
+++ b/src/Cropty.hs
@@ -59,7 +59,7 @@
 
 import Data.ByteString (ByteString)
 import GHC.Generics (Generic)
-import Data.Binary (Binary(..), encode)
+import Data.Binary (Binary(..), encode, decode)
 import qualified Crypto.PubKey.RSA.Types (Error (..))
 import Crypto.Error (CryptoError (..))
 import Control.Exception (Exception, throwIO)
@@ -307,8 +307,25 @@
   , signedEncoded :: ByteString
   , signature :: Signature
   , signedBy :: PublicKey
-  } deriving (Eq, Ord, Show, Read, Generic, Binary)
+  } deriving (Eq, Ord, Show, Read, Generic)
 
+instance Binary a => Binary (Signed a) where
+  put s = do
+    put (signedEncoded s)
+    put (signature s)
+    put (signedBy s)
+  get = do
+    signedEncoded <- get
+    signature <- get
+    signedBy <- get
+    pure $ Signed
+      { signed = decode $ LBS.fromStrict signedEncoded
+      , signedEncoded
+      , signature
+      , signedBy
+      }
+    
+-- | Create a 'Signed' piece of data.
 mkSigned :: Binary a => PrivateKey -> a -> IO (Signed a)
 mkSigned privateKey signed = do
   let signedEncoded = LBS.toStrict $ encode signed
@@ -316,5 +333,6 @@
   let signedBy = privateToPublic privateKey
   pure $ Signed { signed, signedEncoded, signature, signedBy }
   
+-- | Verify a 'Signed' piece of data.
 verifySigned :: Signed a -> Bool
 verifySigned s = verify (signedBy s) (signedEncoded s) (signature s)
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE BlockArguments #-}
 module Main where
 
+import Data.Binary (encode, decode)
 import Cropty
 import Control.Monad.IO.Class (liftIO)
 import Hedgehog
@@ -29,6 +30,7 @@
       x <- forAll gen
       sig <- liftIO (sign privateKey x)
       sig' <- liftIO (mkSigned privateKey x)
+      assert (decode (encode sig') == sig')
       assert (verify publicKey x sig)
       assert (verifySigned sig')
   guard =<< checkParallel (Group "Encryption/Decryption" [
