diff --git a/Hclip.cabal b/Hclip.cabal
--- a/Hclip.cabal
+++ b/Hclip.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.1.0.0
+version:             1.0.0.0
 
 -- A short (one-line) description of the package.
 synopsis:            A small cross-platform library for reading and modifying the system clipboard.
diff --git a/System/Hclip.hs b/System/Hclip.hs
--- a/System/Hclip.hs
+++ b/System/Hclip.hs
@@ -19,7 +19,8 @@
 module System.Hclip (
         getClipboard, 
         setClipboard, 
-        modifyClipboard
+        modifyClipboard,
+        ClipboardError(..)
   ) where
 
 import System.Process (runInteractiveCommand, readProcessWithExitCode) 
@@ -42,49 +43,77 @@
 #endif
 
 
-
-type ErrorWithIO = ErrorT String IO
-
 -- | Clipboard Actions
-data Command = GetClipboard | SetClipboard String 
+data Command = GetClipboard 
+             | SetClipboard String 
 
+
 -- | Supported Operating Systems
 data Linux = Linux deriving (Show)
 data Darwin = Darwin deriving (Show)
 data Windows = Windows deriving (Show)
 
 
+-- | Error Types
+data ClipboardError = UnsupportedOS String
+                    | NoTextualData
+                    | MissingCommands [String]
+                    | MiscError String
+                      deriving (Eq)
+
+instance Show ClipboardError where
+  show (UnsupportedOS os) = "Unsupported Operating System: " ++ os
+  show NoTextualData = "Clipboard doesn't contain textual data."
+  show (MissingCommands cmds) = "Hclip requires " ++ apps ++ " installed."
+    where apps = intercalate " or " cmds
+  show (MiscError str) = str
+
+instance Error ClipboardError where
+  noMsg = MiscError "Unknown error"
+  strMsg = MiscError
+
+
+-- | Monad Transformer combining Error and IO
+type ErrorWithIO = ErrorT ClipboardError IO
+
+
 -- | type class for supported operating systems
 class SupportedOS a where
-  clipboard :: a -> Command -> IO (Either String String)
+  clipboard :: a -> Command -> IO (Either ClipboardError String)
 
+
 -- | read clipboard contents
-getClipboard :: IO (Either String String)
+getClipboard :: IO (Either ClipboardError String)
 getClipboard = dispatchCommand GetClipboard
 
+
 -- | set clipboard contents
-setClipboard :: String -> IO (Either String String)
+setClipboard :: String -> IO (Either ClipboardError String)
 setClipboard = dispatchCommand . SetClipboard
 
+
 -- | apply function to clipboard and return the new contents
-modifyClipboard :: (String -> String) -> IO (Either String String)
-modifyClipboard = flip (liftM . liftM) getClipboard >=> either (return . Left) setClipboard
+modifyClipboard :: (String -> String) -> IO (Either ClipboardError String)
+modifyClipboard = flip (liftM . liftM) getClipboard >=> either (return . throwError) setClipboard
 
+
 -- | select the supported operating system
-dispatchCommand :: Command -> IO (Either String String)
+dispatchCommand :: Command -> IO (Either ClipboardError String)
 dispatchCommand = case os of
   "linux" -> clipboard Linux
   "darwin" -> clipboard Darwin
 #if defined(mingw32_HOST_OS) || defined(__MINGW32__)
   "mingw32" -> clipboard Windows 
 #endif
-  unknownOS -> const $ return . Left $ "Unsupported OS: " ++ unknownOS
+  unknownOS -> const $ return . throwError $ UnsupportedOS unknownOS
 
+
 -- | MAC OS: use pbcopy and pbpaste    
 instance SupportedOS Darwin where
   clipboard Darwin GetClipboard = runErrorT $ withExternalCommand "pbcopy" GetClipboard    
   clipboard Darwin c@(SetClipboard s) = runErrorT $ withExternalCommand "pbpaste" c
 
+
 -- | Linux: use xsel or xclip
 instance SupportedOS Linux where
   clipboard Linux command = runErrorT $ do
@@ -96,6 +125,7 @@
       decode "xclip" GetClipboard = "xclip -selection c -o"
       decode "xclip" (SetClipboard _) = "xclip -selection c"
     
+
 -- | Windows: use WinAPI
 #if defined(mingw32_HOST_OS) || defined(__MINGW32__)
 instance SupportedOS Windows where
@@ -106,7 +136,7 @@
         then do 
           h <- getClipboardData cF_TEXT
           bracket (globalLock h) globalUnlock $ liftM Right . peekCAString . castPtr
-        else return $ Left "Clipboard doesn't contain textual data"
+        else return $ throwError NoTextualData
 
   clipboard Windows (SetClipboard s) = 
     withCAString s $ \cstr -> do
@@ -126,8 +156,8 @@
 withExternalCommand :: String -> Command -> ErrorWithIO String
 withExternalCommand prog command = 
   liftIO $ bracket (runInteractiveCommand prog)
-                   (\(inp,outp,stderr,_) -> mapM_ hClose [inp,outp,stderr])
-                   (\(inp,outp,_,_) -> (action command) (inp, outp))
+                   (\(inp, outp, stderr, _) -> mapM_ hClose [inp, outp, stderr])
+                   (\(inp, outp, _, _) -> (action command) (inp, outp))
   where
     action GetClipboard = hGetContents . stdout
     action (SetClipboard text) = (flip hPutStr text >=> const (return text)) . stdin
@@ -139,10 +169,9 @@
 chooseFirstCommand :: [String] -> ErrorWithIO String
 chooseFirstCommand cmds = do
   results <- liftIO $ mapM whichCommand cmds
-  maybe (throwError $ "HClip requires " ++ apps ++ " installed.")
+  maybe (throwError $ MissingCommands cmds)
         return
         (getFirst . mconcat $ map First results)
-  where apps = intercalate " or " cmds
 
 
 -- | use the which-command to check if cmd is installed
