Any shell started with a minus as the first character of argv[0] is a login shell e.g. "-bash" is a login shell.
Many things start your shell this way:
* the "login" command
e.g. logging on an a virtual console
* "su -"
* "sshd"
e.g. ssh <hostname>
* xterms, depending on the settings
e.g. the original xterm if you run "xterm -ls"
or you run "xterm" with "xterm*loginShell: true"
in your ".Xdefaults" or ".Xresources"
* some X initialization scripts,
e.g. when logging in to a "Default" session via gdm or kdm
(how exactly this works depends on your distribution
some explicitly source .profile instead)
With "bash" you can also manually create a login shell using "bash -l" or "bash --login".
A side note to mikelward's answer for OSX users: by default Terminal.app starts all shells as login shells[1]. You can easily change this behavior, but it's the default and many people never even know it's set that way. This is different from defaults on many (most?) Linux systems, and so people coming from one direction to the other often become confused about where to put startup information. (I suppose it's not exactly a Linux versus OSX thing. It has more to do with window managers and how you start up your machine. If you log into Gnome, KDE or similar environments though, most terminal windows you start in the GUI are not login shells. So people get used to that behavior.)
Now combine those issues with the chart and you end up with something that is, true- deterministic, but not really useful. In the end, most people end up just having the startup files boil down to the same thing by sourcing their preferred one. And in the end most people don't try to think to much about the login vs. interactive vs. batch vs. posix/sh - even when they should be.
http://news.ycombinator.com/item?id=4369485