I think there needs to be some method of distinguishing statics from normal bindings. The main problem with statics looking identical to normal variables is with patterns (this applies to enum variants as well, which are also distinguished by casing conventions):
static foo: uint = 56;
// a bunch of unrelated code...
match frobnicate() {
Some(foo) => { ... },
_ => fail!("frobnicate() failed!"),
}
This code might seem innocent, but in fact has a subtle bug in it. The foo in the first match arm is in fact referring to the static defined many lines up, and so the match will fall back on the second arm in all cases except when frobnicate() returns Some(56). This bug is very difficult to locate, because the foo in the pattern just happens to conflict with the foo static above (which the author has probably forgotten exists).
I’ve seen people get extremely confused about this on IRC a few times (it’s more common than you might think), so I decided to turn the lint on by default, so that people rename their statics before they happen to make a name conflict in a pattern. All the other naming lints are on by default, anyway.