diff --git a/AI/SVM/Base.hs b/AI/SVM/Base.hs
--- a/AI/SVM/Base.hs
+++ b/AI/SVM/Base.hs
@@ -33,31 +33,34 @@
                  ,predict
                  )  where
 
-import qualified Data.Vector.Storable as V
-import qualified Data.Vector as GV
-import Data.Vector.Storable ((!))
 import Bindings.SVM
-import Foreign.C.Types
+import Control.Applicative
+import Control.Arrow (first, second, (***), (&&&))
+import Control.Exception 
+import Control.Monad
+import Data.Binary
+import Data.IORef
+import Data.List
+import Data.Map (Map)
+import Data.Tuple
+import Data.Vector.Storable ((!))
 import Foreign.C.String
-import Foreign.Ptr
+import Foreign.C.Types
 import Foreign.ForeignPtr
-import qualified Foreign.Concurrent as C
-import Foreign.Marshal.Utils
-import Foreign.Marshal.Array
 import Foreign.Marshal.Alloc
-import Control.Applicative
-import System.IO.Unsafe
+import Foreign.Marshal.Array
+import Foreign.Marshal.Utils
+import Foreign.Ptr
 import Foreign.Storable
-import Control.Monad
-import Control.Arrow (first, second, (***), (&&&))
 import System.Directory
-import Data.IORef
-import Control.Exception 
 import System.IO.Error
-import Data.Tuple
-import Data.Map (Map)
+import System.IO.Unsafe
+import qualified Data.ByteString.Lazy as B
 import qualified Data.Map as Map
-import Data.List
+import qualified Data.Vector as GV
+import qualified Data.Vector.Storable as V
+import qualified Foreign.Concurrent as C
+import AI.SVM.Common
 
 class SVMVector a where
     convert :: a -> V.Vector Double
@@ -85,6 +88,7 @@
 
 
 
+
 {-# SPECIALIZE convertDense :: V.Vector Double -> V.Vector C'svm_node #-}
 {-# SPECIALIZE convertDense :: V.Vector Float -> V.Vector C'svm_node #-}
 convertDense :: (V.Storable a, Real a) => V.Vector a -> V.Vector C'svm_node
@@ -121,6 +125,20 @@
 
 getModelPtr (SVM fp) = fp
 
+-- | Somewhat unsafe binary instance. This goes through the disk.
+instance Binary SVM where
+    put s = put $ idiotToStr s
+    get   = get >>= return . idiotFromStr
+
+idiotToStr svm = unsafePerformIO $ withTmp $ \tmp -> do
+                    saveSVM tmp svm
+                    B.readFile tmp
+idiotFromStr svm = unsafePerformIO $ withTmp $ \tmp -> do
+                    B.writeFile tmp svm
+                    loadSVM tmp
+                
+
+
 modelFinalizer :: Ptr C'svm_model -> IO ()
 modelFinalizer modelPtr = with modelPtr c'svm_free_and_destroy_model
 
@@ -176,6 +194,52 @@
     , c'svm_parameter'shrinking = 1
     , c'svm_parameter'probability = 0
     }
+
+instance Binary CInt where
+    put cint = put (fromIntegral cint :: Int)
+    get = fromIntegral <$> (get :: Get Int) 
+
+instance Binary CDouble where
+    put cint = put (realToFrac cint :: Double)
+    get = realToFrac <$> (get :: Get Double) 
+
+encodeParams C'svm_parameter{..} = do
+    put c'svm_parameter'svm_type 
+    put c'svm_parameter'kernel_type 
+    put c'svm_parameter'degree 
+    put c'svm_parameter'gamma  
+    put c'svm_parameter'coef0  
+    put c'svm_parameter'cache_size 
+    put c'svm_parameter'eps 
+    put c'svm_parameter'C   
+    put c'svm_parameter'nr_weight 
+    --put c'svm_parameter'weight_label = nullPtr
+    --put c'svm_parameter'weight       = nullPtr
+    put c'svm_parameter'nu 
+    put c'svm_parameter'p  
+    put c'svm_parameter'shrinking
+    put c'svm_parameter'probability 
+
+decodeParams b = do     
+    c'svm_parameter'svm_type <- get
+    c'svm_parameter'kernel_type <- get
+    c'svm_parameter'degree      <- get   
+    c'svm_parameter'gamma       <- get 
+    c'svm_parameter'coef0       <- get
+    c'svm_parameter'cache_size  <- get 
+    c'svm_parameter'eps         <- get
+    c'svm_parameter'C           <- get
+    c'svm_parameter'nr_weight   <- get
+    c'svm_parameter'nu          <- get
+    c'svm_parameter'p           <- get
+    c'svm_parameter'shrinking   <- get
+    c'svm_parameter'probability <- get
+    let c'svm_parameter'weight_label = nullPtr
+        c'svm_parameter'weight = nullPtr
+    return C'svm_parameter{..}
+
+                   
+     
 
 -- | SVM variants
 data SVMType = 
diff --git a/AI/SVM/Common.hs b/AI/SVM/Common.hs
new file mode 100644
--- /dev/null
+++ b/AI/SVM/Common.hs
@@ -0,0 +1,25 @@
+module AI.SVM.Common where
+
+import Data.Char
+import System.Random.MWC
+import Control.Applicative
+import Control.Monad
+import System.Directory
+import Control.Exception
+
+-- * Utilities
+randomName = withSystemRandom $ \gen -> map chr <$> replicateM 16 (uniformR (97,122::Int) gen)
+                                          :: IO String 
+
+-- | Get a name for a temporary file, run operation with the filename and erase the file if the 
+--   operation creates it.
+withTmp op = do
+        fp <- getTemporaryDirectory
+        out <- randomName
+        bracket (return ())
+                (\() -> do
+                         e <- doesFileExist out 
+                         when e (removeFile out))
+                (\() -> op (fp++"/"++out))
+        
+
diff --git a/AI/SVM/Simple.hs b/AI/SVM/Simple.hs
--- a/AI/SVM/Simple.hs
+++ b/AI/SVM/Simple.hs
@@ -36,6 +36,8 @@
 module AI.SVM.Simple (
 		 -- * Basic types
                   RegressorType(..), ClassifierType(..)
+                 ,Kernel(..)
+                 ,SVMOneClass(), SVMClassifier(), SVMRegressor()
 		 -- * Classifier machines
                  ,trainClassifier, classify   
 		 -- * One class machines
@@ -49,18 +51,16 @@
 import AI.SVM.Base
 import Control.Applicative
 import Control.Arrow (second, (***), (&&&))
-import Control.Exception
 import Control.Monad
 import Data.Binary
-import Data.Char
 import Data.List
 import Data.Map (Map)
 import Data.Tuple
 import System.Directory
 import System.IO.Unsafe
-import System.Random.MWC
 import qualified Data.ByteString.Lazy as B
 import qualified Data.Map as Map
+import AI.SVM.Common
 
 
 -- | Supported SVM classifiers
@@ -77,6 +77,18 @@
 newtype SVMRegressor  = SVMRegressor SVM 
 newtype SVMOneClass   = SVMOneClass SVM 
 
+instance (Ord a, Binary a) => Binary (SVMClassifier a) where
+    put (SVMClassifier svm a b) = put svm >> put a >> put b
+    get = SVMClassifier <$> get <*> get <*> get 
+
+instance Binary SVMRegressor where
+    put (SVMRegressor r) = put r
+    get = SVMRegressor <$> get
+
+instance Binary SVMOneClass where
+    put (SVMOneClass r) = put r
+    get = SVMOneClass <$> get
+
 generalizeClassifier C{..} = C_SVC{cost_=cost}
 generalizeClassifier NU{..} = NU_SVC{cost_=cost, nu_=nu}
 
@@ -107,21 +119,6 @@
 instance Persisting SVMOneClass where
     save fp (SVMOneClass a) = saveSVM fp a
     load fp = SVMOneClass <$> loadSVM fp
---
--- * Utilities
-randomName = withSystemRandom $ \gen -> map chr <$> replicateM 16 (uniformR (97,122::Int) gen)
-                                          :: IO String 
-
--- | Get a name for a temporary file, run operation with the filename and erase the file if the 
---   operation creates it.
-withTmp op = do
-        fp <- getTemporaryDirectory
-        out <- randomName
-        bracket (return ())
-                (\() -> do
-                         e <- doesFileExist out 
-                         when e (removeFile out))
-                (\() -> op (fp++"/"++out))
 
 -- | Train an SVM classifier of given type. 
 trainClassifier
diff --git a/svm-simple.cabal b/svm-simple.cabal
--- a/svm-simple.cabal
+++ b/svm-simple.cabal
@@ -1,5 +1,5 @@
 name:                svm-simple
-version:             0.2.1
+version:             0.2.2
 synopsis:            Medium level, simplified, bindings to libsvm
 description:
   This is a set of simplified bindings to libsvm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/> suite
@@ -7,6 +7,11 @@
   and support vector regression. 
   .
   .
+  Changes in version 0.2.2
+  .
+  * Rather ugly binary instances
+  * Exporting SVM types
+  .
   Changes in version 0.2.1
   .
   * Added operations for saving and loading SVMs to the 'Simple'-interface.
@@ -37,6 +42,8 @@
     Examples/PlotOneClass.hs
 
 library
+  other-modules:
+    AI.SVM.Common
   Exposed-modules:
     AI.SVM.Simple
     AI.SVM.Base
