diff --git a/Data/Monoid/Instances/ByteString/UTF8.hs b/Data/Monoid/Instances/ByteString/UTF8.hs
--- a/Data/Monoid/Instances/ByteString/UTF8.hs
+++ b/Data/Monoid/Instances/ByteString/UTF8.hs
@@ -9,11 +9,12 @@
 -- 
 
 module Data.Monoid.Instances.ByteString.UTF8 (
-   ByteStringUTF8(..)
+   ByteStringUTF8(..), decode
    )
 where
 
-import Prelude hiding (drop, dropWhile, foldl, foldl1, foldr, foldr1, scanl, scanr, scanl1, scanr1, map, concatMap, break, span)
+import Prelude hiding (drop, dropWhile, foldl, foldl1, foldr, foldr1, scanl, scanr, scanl1, scanr1,
+                       map, concatMap, break, span)
 
 import Data.Bits ((.&.), (.|.), shiftL, shiftR)
 import Data.Char (chr, ord)
@@ -36,6 +37,20 @@
 import qualified Data.Monoid.Textual as Textual (TextualMonoid(..))
 
 newtype ByteStringUTF8 = ByteStringUTF8 ByteString deriving (Eq, Ord)
+
+-- | Takes a raw 'ByteString' chunk and returns a pair of 'ByteStringUTF8' decoding the prefix of the chunk and the
+-- remaining suffix that is either null or contains the incomplete last character of the chunk.
+decode :: ByteString -> (ByteStringUTF8, ByteString)
+decode bs
+   | ByteString.null bs || l < 0x80 = (ByteStringUTF8 bs, mempty)
+   | l >= 0xC0 = (ByteStringUTF8 (ByteString.init bs), ByteString.singleton l)
+   | ByteString.null prefix = (mempty, bs)
+   | otherwise =
+      case toChar (ByteString.last prefix) suffix
+      of Nothing -> (ByteStringUTF8 (ByteString.init prefix), drop (ByteString.length prefix - 1) bs)
+         Just{} -> (ByteStringUTF8 bs, mempty)
+   where (prefix, suffix) = ByteString.breakEnd byteStartsCharacter bs
+         l = ByteString.last bs
 
 instance Monoid ByteStringUTF8 where
    mempty = ByteStringUTF8 ByteString.empty
diff --git a/monoid-subclasses.cabal b/monoid-subclasses.cabal
--- a/monoid-subclasses.cabal
+++ b/monoid-subclasses.cabal
@@ -1,23 +1,24 @@
 Name:                monoid-subclasses
-Version:             0.3.2
+Version:             0.3.3
 Cabal-Version:       >= 1.10
 Build-Type:          Simple
 Synopsis:            Subclasses of Monoid
-Category:            Data
+Category:            Data, Algebra, Text
 Tested-with:         GHC
 Description:
-  This package defines a hierarchy of subclasses of 'Monoid' together with their instances for all data
-  structures from base, containers, and text packages.
+  A hierarchy of subclasses of 'Monoid' together with their instances for all data structures from base, containers, and
+  text packages.
   
 License:             BSD3
 License-file:        BSD3-LICENSE.txt
 Copyright:           (c) 2013 Mario Blazevic
 Author:              Mario Blazevic
-Maintainer:          blamario@yahoo.com
+Maintainer:          Mario Blazevic <blamario@yahoo.com>
 Homepage:            https://github.com/blamario/monoid-subclasses/
+Bug-reports:         https://github.com/blamario/monoid-subclasses/issues
 Source-repository head
-  type:              darcs
-  location:          http://code.haskell.org/SCC/
+  type:              git
+  location:          https://github.com/blamario/monoid-subclasses
 
 Library
   Exposed-Modules:   Data.Monoid.Cancellative, Data.Monoid.Factorial, Data.Monoid.Null, Data.Monoid.Textual,
