Paragraph is ALSO invalid markup inside the anchor folks - it too is a block level container. NOT that I see ANY reason to need an extra container around the the first image or the text under it, since you can style the parent ANCHOR.
<a class="thumbnail" href="#thumb">
alt="Orange Kwasind Shirt"
Kwasind Shirt (orange) ... $12.00
Should be ALL that is needed there. Set the anchor to display:block and everything you were doing to the DIV do it on the anchor, set both nested images to display:block, set text-align to center, position the span for your hover effect. You shouldn't need ANY block-level containers in that... It's an excellent example of a paragraph around non-paragraph content.
I would also advise AGAINST using visibility:hidden to hide them - since you're absolute positioning them anyways just set them to left:-999em and then set it to left:0; on hover. Visibility:hidden much like display:none can cause screen reader and search engine issues (allegedly, I've seen no real proof of it, but better safe than sorry).