What you're seeing is expected.
The reason for using the --fast flag is to quickly get your node to the point where it's usable, and to do this initially only the block headers will by synced. You'll see messages of the following format (note "header(s)"):
I0416 13:35:53.497422 30629 blockchain.go:889] imported 192 header(s) (0 ignored) in 71.941018ms. #6336 [2edbbc3f… / b80c9ac3…]
Once this preliminary sync of the headers is complete you'll see the following message:
I0416 17:16:12.631667 30629 blockchain.go:1251] imported 195 block(s) (0 queued 0 ignored) including 0 txs in 1.235990428s. #384 [d707e667 / d3d5d5c1] I0416 17:16:12.631825 30629 sync.go:180] fast sync complete, auto disabling I0416 17:16:48.831757 30629 blockchain.go:1251] imported 4 block(s) (0 queued 0 ignored) including 0 txs in 12.933585ms. #388 [bbb506ab / 0ace7268]
Geth will then start to sync the remaining block data (i.e. everything not in the block headers). You'll see messages of the following format (note "block(s)"):
I0416 13:32:23.331906 30581 blockchain.go:1251] imported 256 block(s) (0 queued 0 ignored) including 0 txs in 979.938402ms. #6366 [66dcf4c1 / c5d009a1]
[Explanation taken from the (much) longer answer, here.]