1. Test language-specific knowledge - it's not a bad thing to not know all the small quirks or details of a language since they're generally not too useful, but when someone does know them it tends to be a good sign that they really enjoy coding and learning. And of course there is a certain minimum amount of knowledge that should be required - listing Java as "proficient" on your resume while not knowing the difference between abstract classes and interfaces might indicate a problem.
2. Design question - just a simple toy problem like "how would you design the book management system for a library?". It's easy to use such a problem to probe into some different aspects of programming like concurrency and databases, just to see how much the person knows.
3. A not-crazy-hard algorithms questions - people often say algo questions are irrelevant to actual work, and I agree with that. But I think algorithms are really a core part of the CS curriculum at every school, so getting completely stuck on a medium-difficulty algorithm question should raise some flags.
4. Resume-specific things - it's always nice for an interviewer to show that they've actually read your resume, and it can be a good way to convey some strengths that aren't otherwise evident.
I guess my philosophy is to interview in a way that can test the depth of a candidate's knowledge while not being obnoxiously tedious or memorization-focused. i.e. someone who has written a lot of production code should do better in an interview than someone who's just memorized every problem in Cracking the Coding Interview. So, ideally with the screening round clearing the first part (language-specific knowledge), and then 2 or 3 subsequent interviews that cover design and algos.