diff --git a/casadi-bindings.cabal b/casadi-bindings.cabal
--- a/casadi-bindings.cabal
+++ b/casadi-bindings.cabal
@@ -1,5 +1,5 @@
 name:                casadi-bindings
-version:             2.1.0.1
+version:             2.1.3.0
 synopsis:            mid-level bindings to CasADi
 category:            Numerical, Math
 description:
@@ -57,7 +57,7 @@
                        vector,
                        containers,
                        casadi-bindings-internal == 0.1.1,
-                       casadi-bindings-core     == 2.1.0.0
+                       casadi-bindings-core     == 2.1.3.0
   default-language:    Haskell2010
 
 source-repository head
diff --git a/src/Casadi/DMatrix.hs b/src/Casadi/DMatrix.hs
--- a/src/Casadi/DMatrix.hs
+++ b/src/Casadi/DMatrix.hs
@@ -1,7 +1,7 @@
 {-# OPTIONS_GHC -Wall -fno-cse -fno-warn-orphans #-}
 
 module Casadi.DMatrix
-       ( DMatrix(), dcrs, dmm, dvector, ddata, ddiag
+       ( DMatrix, dcrs, dmm, dvector, ddata, ddiag
        , ddense, dsparse, dtrans, dtriu, dtril
        , dsize, dsize1, dsize2, dnumel
        , dvertcat, dhorzcat, dveccat, dvertsplit, dhorzsplit
@@ -16,6 +16,10 @@
 import qualified Casadi.Core.Tools as C
 
 import Casadi.Overloading ( Fmod(..), ArcTan2(..), SymOrd(..) )
+
+instance Show DMatrix where
+  show x = unsafePerformIO (dmatrix_getDescription x)
+  {-# NOINLINE show #-}
 
 -- | matrix matrix product
 dmm :: DMatrix -> DMatrix -> DMatrix
diff --git a/src/Casadi/Function.hs b/src/Casadi/Function.hs
--- a/src/Casadi/Function.hs
+++ b/src/Casadi/Function.hs
@@ -1,7 +1,7 @@
 {-# OPTIONS_GHC -Wall -fno-cse -fno-warn-orphans #-}
 
 module Casadi.Function
-       ( C.MXFunction, C.Function, callMX, callSX, evalDMatrix
+       ( C.Function, callMX, callSX, evalDMatrix
        , jacobian, gradient, derivative
        , generateCode, externalFunction
        ) where
@@ -11,7 +11,6 @@
 import System.IO.Unsafe ( unsafePerformIO )
 import Control.Monad ( zipWithM_ )
 
-import qualified Casadi.Core.Classes.MXFunction as C
 import qualified Casadi.Core.Classes.IOInterfaceFunction as C
 import qualified Casadi.Core.Classes.Function as C
 import qualified Casadi.Core.Classes.ExternalFunction as C
@@ -19,6 +18,11 @@
 import Casadi.SX ( SX )
 import Casadi.MX ( MX )
 import Casadi.DMatrix ( DMatrix )
+import Casadi.SharedObject ( castSharedObject )
+
+instance Show C.Function where
+  show x = show (castSharedObject x)
+  {-# NOINLINE show #-}
 
 -- | call an MXFunction on symbolic inputs, getting symbolic outputs
 callMX :: C.FunctionClass f => f -> Vector MX -> Vector MX
diff --git a/src/Casadi/GenericC.hs b/src/Casadi/GenericC.hs
--- a/src/Casadi/GenericC.hs
+++ b/src/Casadi/GenericC.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -Wall #-}
+{-# OPTIONS_GHC -Wall -fno-warn-orphans -fno-cse #-}
 {-# Language FlexibleInstances #-}
 
 module Casadi.GenericC
@@ -9,6 +9,12 @@
 import Data.Vector ( Vector )
 import Casadi.Core.Classes.Function ( Function )
 import Casadi.Core.Classes.GenericType
+
+import Casadi.SharedObject ( castSharedObject )
+
+instance Show GenericType where
+  show x = show (castSharedObject x)
+  {-# NOINLINE show #-}
 
 class GenericC a where
   mkGeneric :: a -> IO GenericType
diff --git a/src/Casadi/MX.hs b/src/Casadi/MX.hs
--- a/src/Casadi/MX.hs
+++ b/src/Casadi/MX.hs
@@ -1,7 +1,7 @@
 {-# OPTIONS_GHC -Wall -fno-cse -fno-warn-orphans #-}
 
 module Casadi.MX
-       ( MX(), sym, symV, symM, mm, trans, diag
+       ( MX, sym, symV, symM, mm, trans, diag
        , gradient, jacobian -- , hessian
        , solve
        , expand
@@ -25,9 +25,14 @@
 import qualified Casadi.Core.Tools as C
 
 import Casadi.Overloading ( Fmod(..), ArcTan2(..), SymOrd(..) )
+import Casadi.SharedObject ( castSharedObject )
 
 instance Conjugate MX where
   conjugate = id
+
+instance Show MX where
+  show x = show (castSharedObject x)
+  {-# NOINLINE show #-}
 
 sym :: String -> IO MX
 sym x = fmap castMX (mx_sym__5 x)
diff --git a/src/Casadi/MXFunction.hs b/src/Casadi/MXFunction.hs
--- a/src/Casadi/MXFunction.hs
+++ b/src/Casadi/MXFunction.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -Wall #-}
+{-# OPTIONS_GHC -Wall -fno-warn-orphans -fno-cse #-}
 
 module Casadi.MXFunction
        ( C.MXFunction
@@ -10,7 +10,13 @@
 
 import qualified Casadi.Core.Classes.Function as C
 import qualified Casadi.Core.Classes.MXFunction as C
+
 import Casadi.MX ( MX )
+import Casadi.SharedObject ( castSharedObject )
+
+instance Show C.MXFunction where
+  show x = show (castSharedObject x)
+  {-# NOINLINE show #-}
 
 mxFunction :: Vector MX -> Vector MX -> IO C.MXFunction
 mxFunction = C.mxFunction__0
diff --git a/src/Casadi/Option.hs b/src/Casadi/Option.hs
--- a/src/Casadi/Option.hs
+++ b/src/Casadi/Option.hs
@@ -27,4 +27,3 @@
   if has
     then optionsFunctionality_getOption f name >>= fromGeneric
     else return Nothing
-
diff --git a/src/Casadi/SX.hs b/src/Casadi/SX.hs
--- a/src/Casadi/SX.hs
+++ b/src/Casadi/SX.hs
@@ -1,7 +1,7 @@
 {-# OPTIONS_GHC -Wall -fno-cse -fno-warn-orphans #-}
 
 module Casadi.SX
-       ( SX(), ssym, ssymV, ssymM, smm, strans
+       ( SX, ssym, ssymV, ssymM, smm, strans
        , sgradient, sjacobian, shessian, svector, sdiag
        , ssolve
        , sdata
@@ -25,6 +25,10 @@
 import qualified Casadi.Core.Tools as C
 
 import Casadi.Overloading ( Fmod(..), ArcTan2(..), SymOrd(..) )
+
+instance Show SX where
+  show x = unsafePerformIO (sx_getDescription x)
+  {-# NOINLINE show #-}
 
 instance Conjugate SX where
   conjugate = id
diff --git a/src/Casadi/SXElement.hs b/src/Casadi/SXElement.hs
--- a/src/Casadi/SXElement.hs
+++ b/src/Casadi/SXElement.hs
@@ -1,20 +1,20 @@
 {-# OPTIONS_GHC -Wall -fno-cse -fno-warn-orphans #-}
 
 module Casadi.SXElement
-       ( SXElement(), sxElement_sym
+       ( SXElement, sxElement_sym
        ) where
 
---import qualified Data.Vector as V
+import qualified Data.Vector as V
 import System.IO.Unsafe ( unsafePerformIO )
 import Linear.Conjugate ( Conjugate(..) )
 
 import Casadi.Core.Classes.SXElement
 
---import Casadi.SX ( svector )
+import Casadi.SX ( svector )
 import Casadi.Overloading ( Fmod(..), ArcTan2(..), SymOrd(..) )
 
---instance Show SXElement where
---  show = show . svector . V.singleton
+instance Show SXElement where
+  show x = show (svector (V.singleton x))
 
 instance Conjugate SXElement where
   conjugate = id
diff --git a/src/Casadi/SXFunction.hs b/src/Casadi/SXFunction.hs
--- a/src/Casadi/SXFunction.hs
+++ b/src/Casadi/SXFunction.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -Wall #-}
+{-# OPTIONS_GHC -Wall -fno-cse -fno-warn-orphans#-}
 
 module Casadi.SXFunction
        ( C.SXFunction
@@ -12,7 +12,13 @@
 import qualified Casadi.Core.Classes.Function as C
 import qualified Casadi.Core.Classes.SXFunction as C
 import qualified Casadi.Core.Classes.MXFunction as C
+
 import Casadi.SX ( SX )
+import Casadi.SharedObject ( castSharedObject )
+
+instance Show C.SXFunction where
+  show x = show (castSharedObject x)
+  {-# NOINLINE show #-}
 
 sxFunction :: Vector SX -> Vector SX -> IO C.SXFunction
 sxFunction = C.sxFunction__0
diff --git a/src/Casadi/SharedObject.hs b/src/Casadi/SharedObject.hs
--- a/src/Casadi/SharedObject.hs
+++ b/src/Casadi/SharedObject.hs
@@ -1,10 +1,17 @@
-{-# OPTIONS_GHC -Wall #-}
+{-# OPTIONS_GHC -Wall -fno-warn-orphans -fno-cse #-}
 
 module Casadi.SharedObject
        ( soInit
+       , C.castSharedObject
        ) where
 
+import System.IO.Unsafe ( unsafePerformIO )
+
 import qualified Casadi.Core.Classes.SharedObject as C
 
 soInit :: C.SharedObjectClass a => a -> IO ()
 soInit = C.sharedObject_init__0
+
+instance Show C.SharedObject where
+  show x = unsafePerformIO (C.sharedObject_getDescription x)
+  {-# NOINLINE show #-}
