I find it a little easier to decide what the Applicative instance "should" do by starting with pair :: f a -> f b -> f (a, b) from which you can derive the rest using pure and fmap
Yes, and actually I wanted that to be the actual method of Applicative (although I called it "liftPair" instead, but maybe "pair" is better), because it make sense to me, I agree with you.
(Although for optimization purposes it can help to also have the other stuff it already has too, in case you want to use an optimized implementation instead of the default implementation.)