There are several use cases for bit fields, even on modern machines.
The first would be when you are handling register level logic. This is common when you are setting modes and how certain pieces of hardware work. This is even more common on embedded devices. On Arduino devices, for example, the "PinMode" logic is basically setting individual bits high or low to indicate whether a digital I/O pin is in "input" or "output" mode.
http://arduino.cc/en/Reference/pinMode
Secondly, when writing optimized, in-line assembly code in a C/C++ program. There are times where you want to take advantage of hardware-optimized instructions to speed up your program's execution as much as possible:
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
A final common example is when writing packet drivers or implementing specific protocols. I recently just posted a question on this, where it turns out I was using a 32-bit variable instead of an 8-bit variable composed of bitfields, which was causing my code to break:
Basic NTP Client in Windows in Visual C++
So, in short: when talking directly to hardware, or in networking code.