Please define your terms. I've seen a number of different, conflicting, and overlapping definitions of "programmer" and "software engineer". It's difficult to answer your question without first understanding what those terms mean to you.
I agree that the definition is kind of fuzzy here. Broadly speaking, "engineer" means that you can design solutions to complex problems. Would a "good programmer" mean someone who can't do that, or can only do that for simple problems? Then, what makes him/her "good"?
And then, there's the problem of what makes a problem "complex". I think that the term "software engineer" more or less comes from the idea that building a large software project with lots of inter-connected parts (e.g., resulting in a large class / object hierarchy) is analogous to a traditional engineer building a complex machine or system with lots of inter-connected parts (e.g., nuclear power plant). But then, this clashes with the fact that most traditional engineers don't work on the overall design of something like that, they specialize in particular parts (e.g., heat exchangers, piping, concrete structures, etc.). In that way, a programmer that is "good" at something in particular should be called a software engineer too, even if he/she has no skills in designing the overall thing. I believe that some companies now are starting to use terms like "Software Systems Engineer" to echo the traditional "Systems Engineer" term that is used for engineers that are working on the integration of subsystems and the broader design issues.
Also, it's good to remember that part of the rise to fame of the "Software Engineer" title in jobs is the fact that many companies want to be able to attract the best people, they want to be able to internally justify the large engineer-level salaries they have to pay for them, and things like that.