diff --git a/saltine.cabal b/saltine.cabal
--- a/saltine.cabal
+++ b/saltine.cabal
@@ -1,5 +1,5 @@
 name:                saltine
-version:             0.0.0.6
+version:             0.0.1.0
 synopsis:            Cryptography that's easy to digest (NaCl/libsodium bindings).
 description:
 
@@ -70,7 +70,7 @@
                 SignProperties
                 StreamProperties
                 Util
-  ghc-options: -Wall -threaded -O0 -rtsopts
+  ghc-options: -Wall -threaded -rtsopts
   hs-source-dirs: tests
   default-language: Haskell2010
   build-depends:
diff --git a/src/Crypto/Saltine/Core/Sign.hs b/src/Crypto/Saltine/Core/Sign.hs
--- a/src/Crypto/Saltine/Core/Sign.hs
+++ b/src/Crypto/Saltine/Core/Sign.hs
@@ -28,7 +28,8 @@
 module Crypto.Saltine.Core.Sign (
   SecretKey, PublicKey, Keypair,
   newKeypair,
-  sign, signOpen
+  sign, signOpen,
+  signDetached, signVerifyDetached
   ) where
 
 import           Crypto.Saltine.Class
@@ -116,7 +117,36 @@
       _ -> return   Nothing
   where smlen = S.length sm
 
+-- | Returns just the signature for a message using a SecretKey.
+signDetached :: SecretKey
+             -> ByteString
+             -- ^ Message
+             -> ByteString
+             -- ^ Signature
+signDetached (SK k) m = unsafePerformIO $
+    alloca $ \psmlen -> do
+        (_err, sm) <- buildUnsafeCVector' Bytes.sign $ \sigbuf ->
+            constVectors [k, m] $ \[(pk, _), (pm, _)] ->
+                c_sign_detached sigbuf psmlen pm (fromIntegral len) pk
+        smlen <- peek psmlen
+        return $ S.take (fromIntegral smlen) sm
+  where len = S.length m
 
+-- | Returns @True@ if the signature is valid for the given public key and
+-- message.
+signVerifyDetached :: PublicKey
+                   -> ByteString
+                   -- ^ Signature
+                   -> ByteString
+                   -- ^ Message
+                   -> Bool
+signVerifyDetached (PK k) sig sm = unsafePerformIO $
+    constVectors [k, sig, sm] $ \[(pk, _), (psig, _), (psm, _)] -> do
+        res <- c_sign_verify_detached psig psm (fromIntegral len) pk
+        return (res == 0)
+  where len = S.length sm
+
+
 foreign import ccall "crypto_sign_keypair"
   c_sign_keypair :: Ptr CChar
                  -- ^ Public key output buffer
@@ -152,3 +182,26 @@
               -- ^ Public key buffer
               -> IO CInt
               -- ^ 0 if signature is verifiable, -1 otherwise
+
+foreign import ccall "crypto_sign_detached"
+    c_sign_detached :: Ptr CChar
+                    -- ^ Signature output buffer
+                    -> Ptr CULLong
+                    -- ^ Length of the signature
+                    -> Ptr CChar
+                    -- ^ Constant message buffer
+                    -> CULLong
+                    -- ^ Length of message buffer
+                    -> Ptr CChar
+                    -- ^ Constant secret key buffer
+                    -> IO CInt
+foreign import ccall "crypto_sign_verify_detached"
+    c_sign_verify_detached :: Ptr CChar
+                           -- ^ Signature buffer
+                           -> Ptr CChar
+                           -- ^ Constant signed message buffer
+                           -> CULLong
+                           -- ^ Length of signed message buffer
+                           -> Ptr CChar
+                           -- ^ Public key buffer
+                           -> IO CInt
diff --git a/tests/SignProperties.hs b/tests/SignProperties.hs
--- a/tests/SignProperties.hs
+++ b/tests/SignProperties.hs
@@ -22,10 +22,18 @@
     testProperty "Verifies signed message"
     $ \(Message bs) -> signOpen pk1 (sign sk1 bs) == Just bs,
 
+    testProperty "Verifies signed message w/ detached signature"
+    $ \(Message bs) -> signVerifyDetached pk1 (signDetached sk1 bs) bs,
+
     testProperty "Signed message longer than message"
     $ \(Message bs) -> S.length (sign sk1 bs) >= S.length bs,
 
     testProperty "Rejects message with mismatched key"
-    $ \(Message bs) -> not (S.null bs) ==> signOpen pk2 (sign sk1 bs) == Nothing
+    $ \(Message bs) -> not (S.null bs) ==>
+                         signOpen pk2 (sign sk1 bs) == Nothing,
+
+    testProperty "Rejects message with mismatched key w/ detached signature"
+    $ \(Message bs) -> not (S.null bs) ==>
+                         not (signVerifyDetached pk2 (sign sk1 bs) bs)
 
     ]
