So, here's an issue that constantly drives me nuts, and an elegant solution seems so do-able.

void func(int x)
{
  x &= 0xFFFF;
  short s = x; // Error! (but we know x is 0 .. 65535)

  if(x < 256)
  {
    byte b = x; // Error! (we also know x is 0 .. 255)
  }
}

It would be really nice if the compiler would carry around the known possible range of values, and refer to that information when performing down-casting assignments.
It would also be very useful information for the back end, it can choose more efficient types if it knows the range, or produce jump tables rather than branch sequences.

I think the compiler would need a min, max, and mask for any integers, and update them as it works.

There are many sources of this information.
Comparisons effectively limit the range:
if(x > 0)
{
  // x = 0 .. int.max
}
else
{
  // x = int.min .. -1
}

Masks, obviously:
x &= 15;

Also contracts are a really great source of seeding this information on function entry.

Has this been discussed? It seems simple, and it's invisible to the language. It would just reduce some boilerplate (tedious casts), and also offer some great optimisation opportunities.