diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,11 @@
-
+0.5.0 (16/12/2020)
+==================
+* Derive Show and Read instances for SerialPortSettings, CommSpeed, StopBits, Parity, and FlowControl datatypes.
+* Update minimum Cabal-version to 1.10
+* Minor syntax changes
+* Minor code cleanup
 
-4.7 (28/08/2014)
+0.4.7 (28/08/2014)
 ================
 
 * Open in non-blocking mode, immediately reverting to blocking to fix OS-X problem
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,5 @@
 Copyright (c) 2009, Joris Putcuyps
+Copyright (c) 2020, David Cox
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+![Haskell CI](https://github.com/standardsemiconductor/serialport/workflows/Haskell%20CI/badge.svg)
+
 Objectives
 ==========
 * Cross platform: at least Linux, Windows and Mac OS.
diff --git a/System/Hardware/Serialport.hs b/System/Hardware/Serialport.hs
--- a/System/Hardware/Serialport.hs
+++ b/System/Hardware/Serialport.hs
@@ -61,5 +61,5 @@
 import qualified Control.Exception as Ex
 
 -- |Safer device function, so you don't forget to close the device
-withSerial :: String -> SerialPortSettings -> ( SerialPort -> IO a ) -> IO a
+withSerial :: FilePath -> SerialPortSettings -> ( SerialPort -> IO a ) -> IO a
 withSerial dev settings = Ex.bracket (openSerial dev settings) closeSerial
diff --git a/System/Hardware/Serialport/Posix.hsc b/System/Hardware/Serialport/Posix.hsc
--- a/System/Hardware/Serialport/Posix.hsc
+++ b/System/Hardware/Serialport/Posix.hsc
@@ -1,36 +1,42 @@
-{-# LANGUAGE ForeignFunctionInterface, DeriveDataTypeable  #-}
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE DeriveDataTypeable       #-}
+{-# LANGUAGE LambdaCase               #-}
 {-# OPTIONS_HADDOCK hide #-}
 module System.Hardware.Serialport.Posix where
 
-import qualified Data.ByteString.Char8 as B
-import qualified Control.Exception as Ex
-import System.Posix.IO
-import System.Posix.Types
-import System.Posix.Terminal
-import System.Hardware.Serialport.Types
-import Foreign (Ptr, castPtr, alloca, peek, with)
-import Foreign.C
 import GHC.IO.Handle
-import GHC.IO.Device
+import GHC.IO.Device (RawIO(..), IODevice(..), IODeviceType(Stream))
 import GHC.IO.BufferedIO
-import Data.Typeable
 import GHC.IO.Buffer
 import GHC.IO.Encoding
+
+import System.Posix.IO
+import System.Posix.Types (Fd, ByteCount)
+import System.Posix.Terminal
+
+import Foreign (Ptr, castPtr, alloca, peek, with)
+import Foreign.C
+
 import Control.Monad (void)
+
+import Data.Typeable
 import Data.Bits
+import qualified Data.ByteString.Char8 as B
+import qualified Control.Exception     as Ex
 
+import System.Hardware.Serialport.Types
 
-data SerialPort = SerialPort {
-                      fd :: Fd,
-                      portSettings :: SerialPortSettings
-                  }
-                  deriving (Typeable)
 
+data SerialPort = SerialPort
+  { fd           :: Fd
+  , portSettings :: SerialPortSettings
+  } deriving (Show, Typeable)
 
+
 instance RawIO SerialPort where
-  read (SerialPort fd' _) ptr n = return . fromIntegral =<< fdReadBuf fd' ptr (fromIntegral n)
+  read (SerialPort fd' _) ptr n = fromIntegral <$> fdReadBuf fd' ptr (fromIntegral n)
   readNonBlocking _ _ _ = error "readNonBlocking not implemented"
-  write (SerialPort fd' _) ptr n = void (fdWriteBuf fd' ptr (fromIntegral n))
+  write (SerialPort fd' _) ptr n = void $ fdWriteBuf fd' ptr (fromIntegral n)
   writeNonBlocking _ _ _ = error "writenonblocking not implemented"
 
 
@@ -76,7 +82,7 @@
   fd' <- openFd dev ReadWrite Nothing defaultFileFlags { noctty = True, nonBlock = True }
   setFdOption fd' NonBlockingRead False
   let serial_port = SerialPort fd' defaultSerialSettings
-  return =<< setSerialSettings serial_port settings
+  setSerialSettings serial_port settings
 
 
 -- |Use specific encoding for an action and restore old encoding afterwards
@@ -97,20 +103,20 @@
 recv :: SerialPort -> Int -> IO B.ByteString
 recv (SerialPort fd' _) n = do
   result <- withEncoding char8 $ Ex.try $ fdRead fd' count :: IO (Either IOError (String, ByteCount))
-  case result of
-     Right (str, _) -> return $ B.pack str
-     Left _         -> return B.empty
+  return $ case result of
+     Right (str, _) -> B.pack str
+     Left _         -> B.empty
   where
     count = fromIntegral n
 
 
 -- |Send bytes
-send :: SerialPort
-        -> B.ByteString
-        -> IO Int          -- ^ Number of bytes actually sent
-send (SerialPort fd' _ ) msg = do
-  ret <- withEncoding char8 (fdWrite fd' (B.unpack msg))
-  return $ fromIntegral ret
+send
+  :: SerialPort
+  -> B.ByteString
+  -> IO Int          -- ^ Number of bytes actually sent
+send (SerialPort fd' _ ) msg =
+  fromIntegral <$> withEncoding char8 (fdWrite fd' (B.unpack msg))
 
 
 -- |Flush buffers
@@ -230,18 +236,17 @@
 
 
 commSpeedToBaudRate :: CommSpeed -> BaudRate
-commSpeedToBaudRate speed =
-    case speed of
-      CS110 -> B110
-      CS300 -> B300
-      CS600 -> B600
-      CS1200 -> B1200
-      CS2400 -> B2400
-      CS4800 -> B4800
-      CS9600 -> B9600
-      CS19200 -> B19200
-      CS38400 -> B38400
-      CS57600 -> B57600
-      CS115200 -> B115200
+commSpeedToBaudRate = \case
+  CS110    -> B110
+  CS300    -> B300
+  CS600    -> B600
+  CS1200   -> B1200
+  CS2400   -> B2400
+  CS4800   -> B4800
+  CS9600   -> B9600
+  CS19200  -> B19200
+  CS38400  -> B38400
+  CS57600  -> B57600
+  CS115200 -> B115200
 
 
diff --git a/System/Hardware/Serialport/Types.hs b/System/Hardware/Serialport/Types.hs
--- a/System/Hardware/Serialport/Types.hs
+++ b/System/Hardware/Serialport/Types.hs
@@ -3,7 +3,6 @@
 
 import Data.Word
 
-
 -- | Supported baudrates
 data CommSpeed
   = CS110
@@ -17,21 +16,25 @@
   | CS38400
   | CS57600
   | CS115200
-  deriving (Show, Eq, Bounded)
+  deriving (Show, Read, Eq, Bounded)
 
+data StopBits = One | Two
+  deriving (Show, Read, Eq, Bounded)
 
-data StopBits = One | Two deriving (Show, Eq, Bounded)
-data Parity = Even | Odd | NoParity deriving (Show, Eq)
-data FlowControl = Software | NoFlowControl deriving (Show, Eq)
+data Parity = Even | Odd | NoParity
+  deriving (Show, Read, Eq)
 
-data SerialPortSettings = SerialPortSettings {
-                      commSpeed    :: CommSpeed,   -- ^ baudrate
-                      bitsPerWord  :: Word8,       -- ^ Number of bits in a word
-                      stopb        :: StopBits,    -- ^ Number of stop bits
-                      parity       :: Parity,      -- ^ Type of parity
-                      flowControl  :: FlowControl, -- ^ Type of flowcontrol
-                      timeout      :: Int          -- ^ Timeout when receiving a char in tenth of seconds
-                  }
+data FlowControl = Software | NoFlowControl
+  deriving (Show, Read, Eq)
+
+data SerialPortSettings = SerialPortSettings
+  { commSpeed   :: CommSpeed,   -- ^ baudrate
+    bitsPerWord :: Word8,       -- ^ Number of bits in a word
+    stopb       :: StopBits,    -- ^ Number of stop bits
+    parity      :: Parity,      -- ^ Type of parity
+    flowControl :: FlowControl, -- ^ Type of flowcontrol
+    timeout     :: Int          -- ^ Timeout when receiving a char in tenth of seconds
+  } deriving (Show, Read, Eq)
 
 
 -- | Most commonly used configuration
diff --git a/System/Hardware/Serialport/Windows.hs b/System/Hardware/Serialport/Windows.hs
--- a/System/Hardware/Serialport/Windows.hs
+++ b/System/Hardware/Serialport/Windows.hs
@@ -2,27 +2,31 @@
 {-# OPTIONS_HADDOCK hide #-}
 module System.Hardware.Serialport.Windows where
 
-import Data.Bits
-import qualified Data.ByteString.Char8 as B
-import qualified Data.ByteString.Unsafe as BU
-import qualified System.Win32.Comm as Comm
+import GHC.IO.Handle
+import GHC.IO.Device 
+import GHC.IO.BufferedIO
+import GHC.IO.Buffer
+
 import System.Win32.Types
 import System.Win32.File
+import qualified System.Win32.Comm as Comm
+
 import Foreign.Marshal.Alloc
-import System.Hardware.Serialport.Types
+
 import Control.Monad
-import GHC.IO.Handle
-import GHC.IO.Device
-import GHC.IO.BufferedIO
+
 import Data.Typeable
-import GHC.IO.Buffer
+import Data.Bits
+import qualified Data.ByteString.Char8  as B
+import qualified Data.ByteString.Unsafe as BU
 
+import System.Hardware.Serialport.Types
 
-data SerialPort = SerialPort {
-                      handle :: HANDLE,
-                      portSettings :: SerialPortSettings
-                  }
-                  deriving (Typeable)
+
+data SerialPort = SerialPort
+  { handle       :: HANDLE
+  , portSettings :: SerialPortSettings
+  } deriving (Show, Typeable)
 
 
 instance RawIO SerialPort where
diff --git a/serialport.cabal b/serialport.cabal
--- a/serialport.cabal
+++ b/serialport.cabal
@@ -1,14 +1,15 @@
 Name:           serialport
-Version:        0.4.7
-Cabal-Version:  >= 1.8
+Version:        0.5.0
+Cabal-Version:  >= 1.10
 Build-Type:     Simple
 license:        BSD3
 license-file:   LICENSE
-copyright:      (c) 2009-2011 Joris Putcuyps
-author:         Joris Putcuyps
-maintainer:     Joris.Putcuyps@gmail.com
-homepage:       https://github.com/jputcu/serialport
-bug-reports:    https://github.com/jputcu/serialport/issues
+copyright:      (c) 2009-2011 Joris Putcuyps,
+                (c) 2020      David Cox
+author:         Joris Putcuyps, David Cox
+maintainer:     David Cox <standard.semiconductor@gmail.com>
+homepage:       https://github.com/standardsemiconductor/serialport
+bug-reports:    https://github.com/standardsemiconductor/serialport/issues
 synopsis:       Cross platform serial port library.
 description:    Cross platform haskell library for using the serial port.
 category:       Hardware
@@ -18,14 +19,15 @@
 
 source-repository head
   type:     git
-  location: git://github.com/jputcu/serialport.git
+  location: git://github.com/standardsemiconductor/serialport.git
 
 Library
   Exposed-Modules:    System.Hardware.Serialport
   Other-Modules:      System.Hardware.Serialport.Types
   Build-Depends:      base >= 4 && < 5, bytestring
   ghc-options:        -Wall -fno-warn-orphans
-
+  default-language: Haskell2010
+    
   if !os(windows)
     Build-Depends:    unix
     Other-Modules:    System.Hardware.Serialport.Posix
@@ -38,6 +40,7 @@
   type:               exitcode-stdio-1.0
   main-is:            Tests.hs
   hs-source-dirs:     tests
+  default-language:   Haskell2010
   build-depends:      base,
                       HUnit,
                       bytestring,
