I wrote it with binary-strict. I also considered binary, but I would like the library not to throw an exception if the file that it's given is not a JPEG or is a JPEG without EXIF, but rather return an Either. I didn't manage to do that with binary (I mean I could offer an IO monad wrapper with try* but to do that even if you give me a lazy bytestring, when it could be done only with pure code, is annoying).
It annoys me to load the full JPEG in memory just to parse its EXIF though. Then again with binary I'd have to be pretty careful with strictness annotations and so on, although parsing the EXIF is going to be fast and it won't contain that much data. Still, I want the lazy bytestring holding the JPEG file to be released ASAP. It'd be a shame to have it lying in memory, together with holding the JPEG file open until the library caller actually makes use of the EXIF contents...
And then I realized that binary-strict was last updated in 2010, it seems cereal is recommended for strict binary file parsing nowadays.