Cases takes a level specification as its 3rd argument, Cases[expr, patttern, levelspec]. The (documented) default for levelspec is {1}.

Therefore, the following returns {}

In[27]:= Cases[y^2, _Power]

Out[27]= {}

Cases

looks at only level 1 for an expression with head Power. It does not find any because there are none at that level.

In[29]:= FullForm[y^2]

Out[29]//FullForm= Power[y, 2]

Heads -> True will make cases try to match the head of the expression as well. However,

In[96]:= MatchQ[Power, _Power]

Out[96]= False

So you still get an empty list.

In[28]:= Cases[y^2, _Power, Heads -> True]

Out[28]= {}

As Ilian pointed out above you can get the result you want by using a level specification of {0}.

In[44]:= Cases[y^2, _Power, {0}]

Out[44]= {y^2}