Clare, two things strike me about what you describe.
Firstly, he is calling a "dog" "cat" instead. This is a normal stage of language development called overgeneralisation. It's likely he's worked out that the dog has four legs and a tail, so he calls it a cat, because he thinks that's the name for something with four legs and a tail.
Secondly, he doesn't say his own name. The "g" sound at the beginnning of his name is actually very difficult, so even though he has a short name, it isn't easy for him to say.
In any case, it's far more useful for him to name other people than to name himself, so he will be more motivated to say "mum" or "Amy" than to say "Joe" because, well, what use is saying "Joe"? He can't say it to get his own attention, but he can say "mum" to get yours.
Sounds like his language is a bit delayed but following normal lines. I agree with all the posters who have reassured you that these things often take off in huge spurts just when you are getting very worried.