Q:

Enum inheriting from int

I've found this all over the place in this code:
public enum Blah: int
{
    blah = 0,
    blahblah = 1
}

Why would it need to inherit from int? Does it ever need to?

A:

According to the documentation:

Every enumeration type has an
  underlying type, which can be any
  integral type except char. The default
  underlying type of the enumeration
  elements is int.

So, no, you don't need to use int. It would work with any integral type. If you don't specify any it would use int as default and it's this type that will be used to store the enumeration into memory.

A:

Enums are implicitly backed by integers.
: int just restates the default, just like void M(); vs. private void M();.
You can also create enums that are backed by other intergral types, such as enum GiantEnum : long.

A:

You don't need to, it's implied. According to MSDN:

An enumeration is a set of named constants whose underlying type is any integral type except Char. If no underlying type is explicitly declared, Int32 is used. Enum is the base class for all enumerations in the .NET Framework.

This means you could usebyte, sbyte, ushort, int, uint, long, or ulong.
Also, setting the values the way you have described (blah=0, blahblah=1), while redundant, is OK, since, according to the C# Specification

If the declaration of the enum member has no initializer, its associated value is set implicitly, as follows:
• If the enum member is the first enum member declared in the enum type, its associated value is zero.
• Otherwise, the associated value of the enum member is obtained by increasing the associated value of the textually preceding enum member by one. This increased value must be within the range of values that can be represented by the underlying type, otherwise a compile-time error occurs.

