Other method you can use - and which I'm right now experimenting in Orbstinate, with success atm, is to use XNA's GameComponent and DrawableGameComponent classes.
Basically, you have to create a new class which will inherit either one of those two (difference is that DrawableGameComponent has public virtual void Draw(GameTime gametime) method in addition to Initialize(), LoadContent(), UnloadContent() and Update(GameTime) methods) and write all the relevant stuff inside. Then, you register the component when you need it, for example:
public class Game1 : Microsoft.XNA.Framework.Game
{
// snip
MainMenu main = new MainMenu(this);
Components.Add(main);
// snip
}
Game itself will take care of running all relevant methods of each component registered onto Game.Components list when required. So, it boils down to adding components to or removing components from the Components list, which isn't so much different from the Gamestate Manager example Microsoft provided (and which was my starting point as well).
For example, in my game, I'm usually running Main Menu, Options Menu or Game part itself as one component, with Sound Manager being separate component which runs whole time.