I tend to just use global variables instead of singleton stuff.
This, most of my game logic and assets are also in my main class, not just because I used to code imperatively but because I find it easier to never have a deep object hierarchy. My way of thinking is that design patterns rooted in other fields are overkill for game dev. Plus it seems from my testing that it is more efficient to embed one global bitmap data for all objects of the same type, rather than passing one across for each instance.
We all work differently, and with that in mind I think the best advice you can give is to find your own style after dissecting as much source code as you can get the chance to read through.
Ultimately structure and architecture is not logic and mechanics, although the 2 are inseperable fundamentally they mean different things. If you can organise your classes in a way that is simple for you and makes sense, then you are all set to focus on your logic.
I was taught on my cs degree (still want to finish the 3rd year sometime) that programmers spend 80% of their time reading code. Just to fully put it in perspective, this hints at much less than 20% coding, since they have to eat and have a life as well.
Putting it into practice (although it includes reading your own code) certainly gives you a feel for the myriad of possible approaches. For every documented pattern or architecture system source code, there are infinite other ways of doing things. Lateral thought, and being able to spontaneously navigate through or shuffle large parts of your functionality is a huge skill to have in the programming field of problem solving, since things always break when new stuff is added, therefore you need to be alert enough to make them work again.
No single architecture is going to mean that you avoid these hiccups, and by the same token no-one is superhuman enough to forsee every repercussion of every new architecture addition.
Learning to expect not every line of code to be perfect the first time is a truly humble action that will help you to be less frustrated when they don't work first time. I'm not sure how much advice you're asking for here, but another major skill is to always read your compiler errors and deal with them one at at time.
I've always modeled a state machine.
My 'state machine' is a collection of constants, again just global variables:
statesArray[MENU]=MainMenuloop;
statesArray[GAMELOOP]=Mainloop;
statesArray[PAUSE]=Mainloop;
statesArray[GAMEOVER]=GameOverloop;
statesArray[OPTIONS]=Optionsloop;
statesArray[HELP]=Helploop;
..since that's the minimum I could think of to make the program know which state it's on.