This is probably a rare use case, but maybe one you didn't consider. I have a commandline app that sets stdout to NoBuffering in main. If I launch an external process and wish to silence it, I have to reset the BufferMode. Here's my workaround:
hSilence' :: [Handle] -> IO a -> IO a
hSilence' hs action = do
bs <- mapM hGetBuffering hs
result <- hSilence hs action
mapM_ (\(h,b) -> hSetBuffering h b) (zip hs bs)
return result