The current signature reads:
withCompression' :: MonadSnap m
=> Set ByteString -- ^ set of compressible MIME types
-> m a -- ^ the web handler to run
-> m ()
The use of Set seems to be too inflexible to me, e.g. if you wanted to compress all mime-types matching text/*, you'd have to enumerate them all; or if you wanted to use a HashSet instead of Set. Also, in some cases you might want to compress the data only if a certain size threshold is exceeded. Thus, I'd suggest using a predicate function with the signature :: ByteString -> Int64 -> Bool instead of a value of type Set ByteString.
:: ByteString -> Int64 -> Bool
PS: is there a reason, that the monadic value of m a is discarded, and is transformed into a m () action?