Multiple objects:
For this you can use custom transform orientations again:
Select the face and press ⎈ Ctrl⎇ AltSpace:
In object mode, select the object you wish to align and press Align to transform orientation in 3D view > Header > Object > Transform:
Once the object is aligned, use transform snapping with face as the snapping element.
If the bottom of the spike thing is already the closest face to the target, then closest should be fine as the snapping target. If not, use the 3D cursor trick as explained here.
I think you should be able to use transform snapping for rotation too, but for no apparent reason there is an inexplicable gap when snapping without a pre-aligned model..
I've reported this as a bug.
Single mesh:
A similar approach to this can be used:
A custom transform orientation aligned to the target face will help too.