A couple of things were tripping you up here.
First, I think you were running bwconncomp on the labeled image, not the binary image. This will double-count a lot of the regions because you'll end up counting the region and its border. See below in my code where I do this (labelImageBWCC = bwconncomp(rgb,4);) and end up with a count of 89 regions.
Second thing is that the watershed transform will sometimes not cleanly break at a junction and instead will end up generating a bunch of little regions right on the border. This is the 'plateau problem' with watershed transforms, but thankfully we can avoid the ramifications of this issue by simply filtering out those little regions with an area threshold.
With those things corrected you can get the right number of coins. Code here:
img = imread('coins.tif');
% Threshold and binarize image and fill holes
binImg = ~im2bw(img, graythresh(img));
binImg = imfill(binImg, 'holes');
% Distance transform and watershed segmentation
D = bwdist(~binImg);
D = -D;
D(~binImg) = -Inf;
L = watershed(D);
% Generate label image
rgb = label2rgb(L,'jet',[.5 .5 .5]);
% Show results of watershed
figure, imshow(rgb,'InitialMagnification','fit')
title('Watershed transform of coins.tif')
% Count number of label regions. Note - this is incorrect! This will
% count borders and background, which we don't want
labelImageBWCC = bwconncomp(rgb,4);
% Generate new binary image that only looks at individual regions generated
% by watershed segmentation so we are counting watershed regions, not label
% colors
binWatershed = L > 1; % 1 is background region; any region with index > 1 is coin
minCoinSize = 50; % minimum size in pixels
regs = regionprops(binWatershed, 'Area', 'Centroid', 'PixelIdxList');
% Remove all regions with size below threshold
regs(vertcat(regs.Area) < minCoinSize) = [];
% Display image with coin count labeled
figure, imshow(img)
hold on
for k = 1:numel(regs)
text(regs(k).Centroid(1), regs(k).Centroid(2), num2str(k), ...
'Color', 'r', 'HorizontalAlignment', 'center')
end
hold off