That case thing would work but I think it would miss presses if they happen at the same time.
The 'best' design depends how much similarity there is between the code to handle the different button presses. If they're completely different, I'd use a loop to shift and mask bits out of the byte, and for each bit that was set I'd call a handler which used a switch statement to select the case corresponding to the bit number of the set bit. If the handlers were very similar, I'd define a function which accepted the bit number as an argument and call that for each set bit.
Either way, to cope with multiple simultaneous button presses you need to test each bit individually, and I'd use a loop to do that.
If you can safely assume only one button is pressed at a time, you can just switch on the original byte value and avoid all that fiddling.